Выполнил: Евдокимов Егор
Cсылка на drive со всем файлами.
Правила, прочитайте внимательно:
@miptstats_ad21_bot. Для начала работы с ботом каждый раз отправляйте /start. Работы, присланные иным способом, не принимаются.File -> Download as -> HTML.Edit -> Insert Image;Баллы за задание:
Легкая часть (достаточно на "хор"):
Сложная часть (необходимо на "отл"):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='whitegrid', font_scale=1.3, palette='Set2')
%matplotlib inline
import requests
from time import sleep
import json
# добавленные
import scipy.stats as sps
from collections import Counter
from collections import OrderedDict
# plotly
import plotly
import plotly.graph_objects as go
import plotly.express as px
import plotly.io as pio
import plotly.figure_factory as ff
a). Пусть $X_1,...,X_n$ выборка из некоторого распределения $\mathsf{P}$, причем ${\sf D} X_1=\sigma^2<+\infty$, и $\sigma$ неизвестно. Рассмотрим оценку $S^2 = \overline{X^2}-\overline{X}^2$ дисперсии $\sigma^2$.
Докажите, что $S^2=\frac1n\sum\limits_{i=1}^n\left(X_i-\overline{X}\right)^2$.
Доказательство: Согласно определению $S^2 = \frac{1}{n} \sum\limits_{i=1}^n X_i^2 - (\frac{1}{n} \sum\limits_{i=1}^n X_i)^2 = \frac{1}{n} (\sum\limits_{i=1}^{n}X_i^2 - 2(\sum\limits_{i=1}^{n}X_i)(\frac{1}{n} \sum\limits_{i=1}^{n}X_i) + n(\frac{1}{n}\sum\limits_{i=1}^n X_i)^{2}) = \frac{1}{n}((\sum\limits_{i=1}^n X_i^2) - 2\overline{X}(\sum\limits_{i=1}^n X_i) + n(\overline{X})^{2}) = \frac{1}{n}(\sum\limits_{i=1}^n X_i^2 -2 \overline{X}\sum\limits_{i=1}^n X_{i} + \sum\limits_{i=1}^n \overline{X}^{2})$ Получаем, что $S^2=\frac1n\sum\limits_{i=1}^n\left(X_i-\overline{X}\right)^2$
b). Оценка $\widehat{\theta}$ называется несмещенной оценкой параметра $\theta$ если для любого $\theta \in \Theta$ выполнено $\mathsf{E}_\theta \widehat{\theta} = \theta$. Иначе говоря, какое бы ни оказалось истинное значение параметра $\theta$ рассматривая оценку $\widehat{\theta}$ в среднем будем получать именно $\theta$.
Является ли статистика $S^2$ несмещенной оценкой $\sigma^2$?
Подсказка. Посчитайте математическое ожидание случайной величины $S^2$. Используйте для этого известные вам свойства математического ожидания.
Доказательство: Так как $X_1, ... X_n$ одинаково распределены, то $\forall i \mathsf E X_i = \mathsf E X_1$. А так как они независимы $\mathsf E(X_i X_j) = \mathsf E X_i \cdot \mathsf E X_j$. Пользуясь линейностью матожидания
$\mathsf ES^{2} = \frac{1}{n}\sum\limits_{i=1}^n \mathsf EX_i^2 - \mathsf E(\frac{1}{n}\sum\limits_{i=1}^n X_{i})^{2} = \mathsf E X^{2}_{1} - \frac{1}{n^2}(\sum\limits_{i=1}^n \mathsf EX_i^2 + 2\sum\limits_{1 \leq i < j \leq n}^n \mathsf E(X_{i}X_{j}))= \mathsf E X^{2}_{1} - \frac{1}{n^2}(\sum\limits_{i=1}^n \mathsf EX_i^2 + 2\sum\limits_{1 \leq i < j \leq n}^n \mathsf E(X_{i}) \mathsf E (X_{j})) = \mathsf E X^{2}_{1} - \frac{1}{n^{2}}(n \mathsf EX_1^2 + 2\frac{n(n-1)}{2} \mathsf (E X_1)^2) = (\frac{n - 1}{n})(\mathsf EX_1^2 - (\mathsf EX_1)^{2}) = (\frac{n - 1}{n})\sf DX_1.$ В итоге статистика $S^2$ не является несмещенной оценкой $\sigma^2$.
Пусть $X_1, ..., X_n$ — выборка из распределения $\mathcal{N}(0, \sigma^2)$. В качестве оценок $\sigma^2$ обычно используют $S^2$ или $\frac{n}{n-1}S^2$. Что можно сказать про их несмещенность?
Ответ: Оценка $S^2$, то есть просто выборочная дисперсия, является смещенной оценкой для теоретической. А исправленная, то есть $\frac{n}{n-1} S^2$ является несмещенной. Так как теоритическая дисперсия для нормального распределения это как раз $\sigma^2$ и по предыдущему пункту $\mathsf E\frac{n}{n-1}S^{2} = {\sf D} X_1 = \sigma^2$, а это соответствует определению несмещенной оценки. Тогда $S^2$ является смещенной оценкой, так как $\mathsf E S^{2} \neq \sigma^2$.
1. Теперь проверьте это на практике. Для каждой из приведенных выше оценок $\widehat{\theta}$ выполните следующие действия.
Вычислите $k = 500$ независимых оценок $\widehat{\theta}_1, ... , \widehat{\theta}_k$ по независимым выборкам $(X_1^1, ... , X_n^1), ... , (X_1^k, ... , X_n^k)$, сгенерированным из распределения $\mathcal{N}(0, \sigma^2)$. Далее вычислите среднее этих оценок, которое обозначим $\overline{\theta}$.
Визуализируйте полученные значения, построив на одном графике точки $(\widehat{\theta}_1, $y$), ... , (\widehat{\theta}_k, y)$ и среднее оценок $(\overline{\theta}, y)$, где $y$ — произвольные различные (например 0, 1, 2) координаты для двух различных типов оценок.
Повторите действие три раза для $n \in \{10, 100, 500\}$. В итоге получится три графика для различных $n$, на каждом из которых изображено поведение двух типов оценок и их среднее.
Используйте приведенный ниже шаблон для визуализации значений.
Внимание! Следите за информативностью и наглядностью графиков. Например, пустых пространств должно быть как можно меньше, ничего не должно быть скомкано, вся нужная информация должна быть представлена. Посмотрите также презентацию с разбора задания 1. Если график чему-то не удовлетворяет, оценка может быть снижена.
Вместо использования matplotlib можно также строить графики с помощью plotly.
Решение:
k = 500
sigma = 1
n_list = [10, 100, 500]
# Вначале:
plt.figure(figsize=(10, 12))
for j, n in enumerate(n_list):
teta = np.array([])
teta_disp = np.array([])
for i in range(k):
sample = np.array(sps.norm(loc=0, scale=sigma).rvs(n))
# sample minus average
sample_min_av = sample - sample.mean()
# sample minus average in square
sample_min_av_sq = sample_min_av * sample_min_av
teta_n = 1 / (n - 1) * sample_min_av_sq.sum()
teta_n_disp = 1 / n * sample_min_av_sq.sum()
teta = np.append(teta, teta_n)
teta_disp = np.append(teta_disp, teta_n_disp)
#отрисовка
y = [0, 1]
plt.subplot(3, 1, j + 1)
# Для каждой оценки:
plt.scatter(teta, np.zeros(k) + y[0],
alpha=0.1, s=100, color='green', label='n/(n-1)*S^2')
plt.scatter(teta.mean(), y[0], marker='*', s=200,
color='w', edgecolors='black')
plt.scatter(teta_disp, np.zeros(k) + y[1],
alpha=0.1, s=100, color='orange', label='S^2')
plt.scatter(teta_disp.mean(), y[1], marker='*', s=200,
color='w', edgecolors='black')
plt.title(f'Размер выборки = {n}')
plt.vlines(1, 0, 1, color='r')
plt.yticks([])
plt.legend()
plt.show()
Вывод: На всех трех графиках с разными размерами выборок видно, что несмещенная оценка всегда ближе к истинному значению $\sigma$, чем смещенная. Зеленая звездочка всегда получается ближе к 1. Также заметно, что при увеличении $n$ разброс $\theta$ уменьшается, да и $\overline{\theta}$ все точнее.
2. Изучим поведение среднего оценок из первого пункта при росте размера выборки. Постройте график зависимости $\overline{\theta}$ от $n$ для двух типов оценок. Для вычисления зависимости нужно один раз сгенерировать выборки из пункта 1 достаточно большого размера (не более 500) и посчитать оценки по подвыборкам, используя функции из numpy. Использовать циклы, а так же функции, разворачивающиеся в цикл (например, np.vectorize), запрещено. Какие из оценок являются асимптотически несмещёнными, т.е. $\forall \theta \in \Theta\colon \mathsf{E}_\theta \widehat{\theta} \to \theta$ при $n\to +\infty$?
Решение:
K = 500
N = 500
linspace = np.linspace(1, N, N)
sample = sps.norm(0, 1).rvs(K * N).reshape(K, N)
sample_sq = sample * sample
# найдем X среднее для выборки размера 1,2,3.., возведем в квадрат
sample = np.cumsum(sample, axis=1)
sample /= linspace
sample_av_sq = sample * sample
# найдем X^2 среднее
sample_sq_av = np.cumsum(sample_sq, axis=1)
sample_sq_av /= linspace
# # получаем набор тет
teta_disp_n = sample_sq_av - sample_av_sq
# на 0 не будем делить 2 точки проблемы не сделают
linspace[0] = 2
teta_n = teta_disp_n * linspace / (linspace - 1)
# усредняем
teta = teta_n.mean(axis=0)
teta_disp = teta_disp_n.mean(axis=0)
#отрисовка
plt.figure(figsize=(20, 10))
plt.scatter(linspace, teta,
alpha=1, s=20, color='green', label='n/(n-1) * S^2')
plt.scatter(linspace, teta_disp,
alpha=1, s=20, color='red', label='S^2')
plt.xlabel("Размер выборки")
plt.ylabel("$\Theta$")
plt.legend()
plt.show()
Сделайте вывод о том, что такое свойство несмещенности. Подтверждают ли сделанные эксперименты полученное в теоретических задачах свойство несмещенности (или отсутствие этого свойства) данных оценок? Поясните, почему в лабораторных по физике при оценке погрешности иногда используют $n-1$ в знаменателе, а не $n$.
Вывод: Видно, что при достаточно больших $n$ оценки очень близки. $\overline{\theta}$ совсем не колеблется в обоих случаях. Опираясь на лабораторные работы по физике можно сказать, что несмещенность оценки говорит об отсутствии систематической ошибки. А свойство состоятельности обеспечиввает близость оценки и величины при увеличении числа измерений. Видно, что при увеличении числа измерений обе оценки прибоижаются к реальному значению $\sigma^2$ они являются состоятельными, но несмещенная оценка делает это быстрее. Поэтому в лабах, где нет возможности проводить эксперимент бесконечность раз, используют несмещенную оценку, дабы получить лучше результат. Собственно, поэтому часто используется $n-1$ в знаменателе.
Замечание. Проведенные эксперименты позволяют сделать вывод только о поведении среднего значения оценки, но ничего не говорят о том, насколько велик их разброс относительно среднего.
В этой задаче вам нужно будет проанализировать вакансии на сайте hh.ru. Для сбора данных рекомендуется использовать официальное API.
1. Сбор данных
Соберите данные о вакансии Data Scientist по Москве в одну таблицу и подготовьте их для анализа. Часто в индустрии подготовленные для анализа таблицы называют витринами. В ней должны быть:
Креативность приветствуется. При работе с данными о заработной плате обратите внимание на валюту и gross/net.
При работе с API не забывайте делать паузы между запросами, чтобы не задудосить сервер HeadHunter.
Пример запроса к API:
# пример
URL = 'https://api.hh.ru/vacancies'
params = {
'text': "Повар",
'area': 1,
'page': 0,
'per_page': 10
}
req = requests.get(URL, params)
data = json.loads(req.content.decode())
data
{'items': [{'id': '44167231',
'premium': False,
'name': 'Бренд Шеф-повар',
'department': None,
'has_test': False,
'response_letter_required': False,
'area': {'id': '1', 'name': 'Москва', 'url': 'https://api.hh.ru/areas/1'},
'salary': {'from': 350000, 'to': None, 'currency': 'RUR', 'gross': False},
'type': {'id': 'open', 'name': 'Открытая'},
'address': None,
'response_url': None,
'sort_point_distance': None,
'published_at': '2021-04-25T15:43:45+0300',
'created_at': '2021-04-25T15:43:45+0300',
'archived': False,
'apply_alternate_url': 'https://hh.ru/applicant/vacancy_response?vacancyId=44167231',
'insider_interview': None,
'url': 'https://api.hh.ru/vacancies/44167231?host=hh.ru',
'alternate_url': 'https://hh.ru/vacancy/44167231',
'relations': [],
'employer': {'id': '2722950',
'name': 'Фуд-холл Гоголь-Моголь',
'url': 'https://api.hh.ru/employers/2722950',
'alternate_url': 'https://hh.ru/employer/2722950',
'logo_urls': None,
'vacancies_url': 'https://api.hh.ru/vacancies?employer_id=2722950',
'trusted': True},
'snippet': {'requirement': 'Продолжительный (не менее 3х лет на одном месте) опыт работы в известных ресторанах на должности Шефа/Бренд-шефа обязателен. ',
'responsibility': 'Разработка меню разных направлений а-ля карт, кулинария, гриль, паназия.'},
'contacts': None,
'schedule': {'id': 'fullDay', 'name': 'Полный день'},
'working_days': [],
'working_time_intervals': [],
'working_time_modes': [],
'accept_temporary': False},
{'id': '43428486',
'premium': False,
'name': 'Повар универсал в ресторан премиум класса',
'department': None,
'has_test': False,
'response_letter_required': False,
'area': {'id': '1', 'name': 'Москва', 'url': 'https://api.hh.ru/areas/1'},
'salary': {'from': 100000, 'to': None, 'currency': 'RUR', 'gross': False},
'type': {'id': 'open', 'name': 'Открытая'},
'address': {'city': 'Москва',
'street': 'Ружейный переулок',
'building': '6с2',
'description': None,
'lat': 55.743786,
'lng': 37.580921,
'raw': 'Москва, Ружейный переулок, 6с2',
'metro': {'station_name': 'Смоленская',
'line_name': 'Арбатско-Покровская',
'station_id': '3.131',
'line_id': '3',
'lat': 55.747713,
'lng': 37.583802},
'metro_stations': [{'station_name': 'Смоленская',
'line_name': 'Арбатско-Покровская',
'station_id': '3.131',
'line_id': '3',
'lat': 55.747713,
'lng': 37.583802},
{'station_name': 'Смоленская',
'line_name': 'Филевская',
'station_id': '4.132',
'line_id': '4',
'lat': 55.749083,
'lng': 37.582173}],
'id': '5502923'},
'response_url': None,
'sort_point_distance': None,
'published_at': '2021-04-25T14:58:46+0300',
'created_at': '2021-04-25T14:58:46+0300',
'archived': False,
'apply_alternate_url': 'https://hh.ru/applicant/vacancy_response?vacancyId=43428486',
'insider_interview': None,
'url': 'https://api.hh.ru/vacancies/43428486?host=hh.ru',
'alternate_url': 'https://hh.ru/vacancy/43428486',
'relations': [],
'employer': {'id': '2841043',
'name': 'Рико',
'url': 'https://api.hh.ru/employers/2841043',
'alternate_url': 'https://hh.ru/employer/2841043',
'logo_urls': {'90': 'https://hhcdn.ru/employer-logo/2221831.jpeg',
'240': 'https://hhcdn.ru/employer-logo/2221832.jpeg',
'original': 'https://hhcdn.ru/employer-logo-original/444966.jpg'},
'vacancies_url': 'https://api.hh.ru/vacancies?employer_id=2841043',
'trusted': True},
'snippet': {'requirement': 'Аккуратность, чистоплотность. Трудолюбие. Обучаемость. Умение работать в команде. Вежливость, грамотная речь.',
'responsibility': 'Работа в холодном цеху. Работа в горячем цеху. Выпечка хлеба и десертов. Приемка продуктов по качеству и количеству. Инвентаризация. '},
'contacts': None,
'schedule': {'id': 'fullDay', 'name': 'Полный день'},
'working_days': [],
'working_time_intervals': [],
'working_time_modes': [],
'accept_temporary': False},
{'id': '43970396',
'premium': False,
'name': 'Повар в ресторан Премиум класса',
'department': None,
'has_test': False,
'response_letter_required': False,
'area': {'id': '1', 'name': 'Москва', 'url': 'https://api.hh.ru/areas/1'},
'salary': {'from': 55000, 'to': 80000, 'currency': 'RUR', 'gross': False},
'type': {'id': 'open', 'name': 'Открытая'},
'address': {'city': 'Москва',
'street': 'Трёхпрудный переулок',
'building': '15',
'description': None,
'lat': 55.766081,
'lng': 37.595591,
'raw': 'Москва, Трёхпрудный переулок, 15',
'metro': None,
'metro_stations': [],
'id': '5441283'},
'response_url': None,
'sort_point_distance': None,
'published_at': '2021-04-23T19:37:31+0300',
'created_at': '2021-04-23T19:37:31+0300',
'archived': False,
'apply_alternate_url': 'https://hh.ru/applicant/vacancy_response?vacancyId=43970396',
'insider_interview': None,
'url': 'https://api.hh.ru/vacancies/43970396?host=hh.ru',
'alternate_url': 'https://hh.ru/vacancy/43970396',
'relations': [],
'employer': {'id': '5284457',
'name': 'Butler',
'url': 'https://api.hh.ru/employers/5284457',
'alternate_url': 'https://hh.ru/employer/5284457',
'logo_urls': {'90': 'https://hhcdn.ru/employer-logo/3755815.jpeg',
'240': 'https://hhcdn.ru/employer-logo/3755816.jpeg',
'original': 'https://hhcdn.ru/employer-logo-original/828733.jpg'},
'vacancies_url': 'https://api.hh.ru/vacancies?employer_id=5284457',
'trusted': True},
'snippet': {'requirement': 'Опыт работы в ресторанах Премиум класса от 4-х лет (Итальянская, Средиземноморская, Европейская кухня). Ответственность, профессиональный подход к работе. ',
'responsibility': 'Приготовление блюд, отдача в соответствии с технологическими картами. Контроль качества используемых продуктов. Контроль за свежестью, кондицией продуктов и соответствие их...'},
'contacts': None,
'schedule': {'id': 'fullDay', 'name': 'Полный день'},
'working_days': [],
'working_time_intervals': [],
'working_time_modes': [],
'accept_temporary': False},
{'id': '43821452',
'premium': False,
'name': 'Повар-универсал',
'department': None,
'has_test': False,
'response_letter_required': False,
'area': {'id': '1', 'name': 'Москва', 'url': 'https://api.hh.ru/areas/1'},
'salary': {'from': 70000, 'to': None, 'currency': 'RUR', 'gross': False},
'type': {'id': 'open', 'name': 'Открытая'},
'address': None,
'response_url': None,
'sort_point_distance': None,
'published_at': '2021-04-24T18:30:59+0300',
'created_at': '2021-04-24T18:30:59+0300',
'archived': False,
'apply_alternate_url': 'https://hh.ru/applicant/vacancy_response?vacancyId=43821452',
'insider_interview': None,
'url': 'https://api.hh.ru/vacancies/43821452?host=hh.ru',
'alternate_url': 'https://hh.ru/vacancy/43821452',
'relations': [],
'employer': {'id': '4896197',
'name': 'Под небом',
'url': 'https://api.hh.ru/employers/4896197',
'alternate_url': 'https://hh.ru/employer/4896197',
'logo_urls': {'original': 'https://hhcdn.ru/employer-logo-original/773301.png',
'90': 'https://hhcdn.ru/employer-logo/3534095.png',
'240': 'https://hhcdn.ru/employer-logo/3534096.png'},
'vacancies_url': 'https://api.hh.ru/vacancies?employer_id=4896197',
'trusted': True},
'snippet': {'requirement': 'Опыт работы <highlighttext>поваром</highlighttext>. - Мед. книжка. - Аккуратность, ответственность.',
'responsibility': 'Приготовление блюд. - Заготовки. - Поддержание порядка на рабочем месте.'},
'contacts': None,
'schedule': {'id': 'shift', 'name': 'Сменный график'},
'working_days': [],
'working_time_intervals': [],
'working_time_modes': [],
'accept_temporary': True},
{'id': '44168751',
'premium': True,
'name': 'Су-шеф, Шеф-повар',
'department': None,
'has_test': False,
'response_letter_required': False,
'area': {'id': '1', 'name': 'Москва', 'url': 'https://api.hh.ru/areas/1'},
'salary': {'from': 60000, 'to': 80000, 'currency': 'RUR', 'gross': False},
'type': {'id': 'open', 'name': 'Открытая'},
'address': {'city': 'Москва',
'street': 'Мосфильмовская улица',
'building': '88к2с5',
'description': None,
'lat': 55.7049,
'lng': 37.492105,
'raw': 'Москва, Мосфильмовская улица, 88к2с5',
'metro': None,
'metro_stations': [],
'id': '5664083'},
'response_url': None,
'sort_point_distance': None,
'published_at': '2021-04-25T21:11:49+0300',
'created_at': '2021-04-25T21:11:49+0300',
'archived': False,
'apply_alternate_url': 'https://hh.ru/applicant/vacancy_response?vacancyId=44168751',
'insider_interview': None,
'url': 'https://api.hh.ru/vacancies/44168751?host=hh.ru',
'alternate_url': 'https://hh.ru/vacancy/44168751',
'relations': [],
'employer': {'id': '3739477',
'name': 'I Do The Kitchen',
'url': 'https://api.hh.ru/employers/3739477',
'alternate_url': 'https://hh.ru/employer/3739477',
'logo_urls': {'original': 'https://hhcdn.ru/employer-logo-original/792832.JPG',
'90': 'https://hhcdn.ru/employer-logo/3612215.jpeg',
'240': 'https://hhcdn.ru/employer-logo/3612216.jpeg'},
'vacancies_url': 'https://api.hh.ru/vacancies?employer_id=3739477',
'trusted': True},
'snippet': {'requirement': 'СТРОГО С ОПЫТОМ РАБОТЫ НА ДОЛЖНОСТИ СУ-ШЕФА от 1-го года в кафе и ресторанах Москвы. Иметь стиль и...',
'responsibility': 'Обеспечение продуктивной и бесперебойной работы кухни. Управление персоналом на смене. Контроль технологии приготовления и качества отдачи блюд. Контроль остатков, списания...'},
'contacts': None,
'schedule': {'id': 'fullDay', 'name': 'Полный день'},
'working_days': [],
'working_time_intervals': [],
'working_time_modes': [],
'accept_temporary': False},
{'id': '43393079',
'premium': False,
'name': 'Повар',
'department': None,
'has_test': False,
'response_letter_required': False,
'area': {'id': '1', 'name': 'Москва', 'url': 'https://api.hh.ru/areas/1'},
'salary': {'from': 110000, 'to': 130000, 'currency': 'RUR', 'gross': True},
'type': {'id': 'open', 'name': 'Открытая'},
'address': None,
'response_url': None,
'sort_point_distance': None,
'published_at': '2021-04-23T11:01:46+0300',
'created_at': '2021-04-23T11:01:46+0300',
'archived': False,
'apply_alternate_url': 'https://hh.ru/applicant/vacancy_response?vacancyId=43393079',
'insider_interview': None,
'url': 'https://api.hh.ru/vacancies/43393079?host=hh.ru',
'alternate_url': 'https://hh.ru/vacancy/43393079',
'relations': [],
'employer': {'id': '4514579',
'name': 'HULAB',
'url': 'https://api.hh.ru/employers/4514579',
'alternate_url': 'https://hh.ru/employer/4514579',
'logo_urls': {'90': 'https://hhcdn.ru/employer-logo/3384457.jpeg',
'240': 'https://hhcdn.ru/employer-logo/3384458.jpeg',
'original': 'https://hhcdn.ru/employer-logo-original/735870.jpeg'},
'vacancies_url': 'https://api.hh.ru/vacancies?employer_id=4514579',
'trusted': True},
'snippet': {'requirement': 'Знание европейской , кавказской , итальянской кухни . Знание детского меню.',
'responsibility': 'Необходимо уметь приготовить вкусную домашнюю еду (чтобы <highlighttext>повар</highlighttext> мог приготовить вкусные шашлыки на мангале, испечь пирожки и тд).'},
'contacts': None,
'schedule': {'id': 'fullDay', 'name': 'Полный день'},
'working_days': [],
'working_time_intervals': [],
'working_time_modes': [],
'accept_temporary': False},
{'id': '43685445',
'premium': False,
'name': 'Шеф-повар',
'department': None,
'has_test': False,
'response_letter_required': False,
'area': {'id': '1', 'name': 'Москва', 'url': 'https://api.hh.ru/areas/1'},
'salary': {'from': 120000, 'to': None, 'currency': 'RUR', 'gross': False},
'type': {'id': 'open', 'name': 'Открытая'},
'address': {'city': 'Камчатский край',
'street': None,
'building': None,
'description': None,
'lat': 61.350179,
'lng': 169.782981,
'raw': 'Камчатский край',
'metro': None,
'metro_stations': [],
'id': '3981983'},
'response_url': None,
'sort_point_distance': None,
'published_at': '2021-04-25T13:12:34+0300',
'created_at': '2021-04-25T13:12:34+0300',
'archived': False,
'apply_alternate_url': 'https://hh.ru/applicant/vacancy_response?vacancyId=43685445',
'insider_interview': None,
'url': 'https://api.hh.ru/vacancies/43685445?host=hh.ru',
'alternate_url': 'https://hh.ru/vacancy/43685445',
'relations': [],
'employer': {'id': '4518101',
'name': 'Архитектурно-строительная компания FANTALIS',
'url': 'https://api.hh.ru/employers/4518101',
'alternate_url': 'https://hh.ru/employer/4518101',
'logo_urls': {'90': 'https://hhcdn.ru/employer-logo/3783511.jpeg',
'240': 'https://hhcdn.ru/employer-logo/3783512.jpeg',
'original': 'https://hhcdn.ru/employer-logo-original/835657.jpg'},
'vacancies_url': 'https://api.hh.ru/vacancies?employer_id=4518101',
'trusted': True},
'snippet': {'requirement': 'С покладистым характером и умением работы с большим коллективом <highlighttext>поваров</highlighttext> до 35 чел. Заинтересованного в долгосрочном сотрудничестве. С опытом работы...',
'responsibility': 'Координация деятельности работы кухни. Контроль качества сырья и готовой продукции. Организация рабочего процесса производства, распределение обязанностей и контроль их выполнения. '},
'contacts': None,
'schedule': {'id': 'flyInFlyOut', 'name': 'Вахтовый метод'},
'working_days': [],
'working_time_intervals': [],
'working_time_modes': [],
'accept_temporary': False},
{'id': '43686573',
'premium': False,
'name': 'Повар',
'department': None,
'has_test': False,
'response_letter_required': True,
'area': {'id': '1', 'name': 'Москва', 'url': 'https://api.hh.ru/areas/1'},
'salary': {'from': 200000, 'to': 250000, 'currency': 'RUR', 'gross': False},
'type': {'id': 'open', 'name': 'Открытая'},
'address': None,
'response_url': None,
'sort_point_distance': None,
'published_at': '2021-04-25T13:31:55+0300',
'created_at': '2021-04-25T13:31:55+0300',
'archived': False,
'apply_alternate_url': 'https://hh.ru/applicant/vacancy_response?vacancyId=43686573',
'insider_interview': None,
'url': 'https://api.hh.ru/vacancies/43686573?host=hh.ru',
'alternate_url': 'https://hh.ru/vacancy/43686573',
'relations': [],
'employer': {'id': '5333735',
'name': 'Яковлева Вероника',
'url': 'https://api.hh.ru/employers/5333735',
'alternate_url': 'https://hh.ru/employer/5333735',
'logo_urls': None,
'vacancies_url': 'https://api.hh.ru/vacancies?employer_id=5333735',
'trusted': False},
'snippet': {'requirement': 'База поставщиков продуктов. Уверенный прошлый опыт. Итальянская и Пан азиатская кухни.',
'responsibility': 'Готовить и сервировать блюда, ресторанная подача блюд. Закупка продуктов. Обслуживание семейных мероприятий ( не часто).'},
'contacts': None,
'schedule': {'id': 'flexible', 'name': 'Гибкий график'},
'working_days': [],
'working_time_intervals': [],
'working_time_modes': [],
'accept_temporary': False},
{'id': '43423271',
'premium': False,
'name': 'Повар-универсал в кафе с завтраками',
'department': None,
'has_test': False,
'response_letter_required': False,
'area': {'id': '1', 'name': 'Москва', 'url': 'https://api.hh.ru/areas/1'},
'salary': {'from': 50000, 'to': 70000, 'currency': 'RUR', 'gross': False},
'type': {'id': 'open', 'name': 'Открытая'},
'address': {'city': 'Москва',
'street': 'Лубянский проезд',
'building': '25с2',
'description': None,
'lat': 55.754578,
'lng': 37.63482,
'raw': 'Москва, Лубянский проезд, 25с2',
'metro': None,
'metro_stations': [],
'id': '715797'},
'response_url': None,
'sort_point_distance': None,
'published_at': '2021-04-25T13:09:09+0300',
'created_at': '2021-04-25T13:09:09+0300',
'archived': False,
'apply_alternate_url': 'https://hh.ru/applicant/vacancy_response?vacancyId=43423271',
'insider_interview': None,
'url': 'https://api.hh.ru/vacancies/43423271?host=hh.ru',
'alternate_url': 'https://hh.ru/vacancy/43423271',
'relations': [],
'employer': {'id': '2375473',
'name': 'Белмол',
'url': 'https://api.hh.ru/employers/2375473',
'alternate_url': 'https://hh.ru/employer/2375473',
'logo_urls': {'240': 'https://hhcdn.ru/employer-logo/3419382.jpeg',
'90': 'https://hhcdn.ru/employer-logo/3419381.jpeg',
'original': 'https://hhcdn.ru/employer-logo-original/744605.JPG'},
'vacancies_url': 'https://api.hh.ru/vacancies?employer_id=2375473',
'trusted': True},
'snippet': {'requirement': 'Наличие профильного образования или опыта работы - желательно. Наличие мед.книжки или готовность ее оформить. Аккуратность, чистоплотность, не конфликтность.',
'responsibility': 'Приготовление блюд и заготовок согласно технологическим картам. Организация и чистота рабочего места. Участие в инвентаризациях и приеме поставок (но у...'},
'contacts': None,
'schedule': {'id': 'fullDay', 'name': 'Полный день'},
'working_days': [],
'working_time_intervals': [],
'working_time_modes': [],
'accept_temporary': False},
{'id': '44120403',
'premium': False,
'name': 'Повар к одной женщине',
'department': None,
'has_test': False,
'response_letter_required': False,
'area': {'id': '1', 'name': 'Москва', 'url': 'https://api.hh.ru/areas/1'},
'salary': {'from': 90000, 'to': 100000, 'currency': 'RUR', 'gross': False},
'type': {'id': 'open', 'name': 'Открытая'},
'address': None,
'response_url': None,
'sort_point_distance': None,
'published_at': '2021-04-22T16:11:07+0300',
'created_at': '2021-04-22T16:11:07+0300',
'archived': False,
'apply_alternate_url': 'https://hh.ru/applicant/vacancy_response?vacancyId=44120403',
'insider_interview': None,
'url': 'https://api.hh.ru/vacancies/44120403?host=hh.ru',
'alternate_url': 'https://hh.ru/vacancy/44120403',
'relations': [],
'employer': {'id': '1175930',
'name': 'Адам и Ева и К',
'url': 'https://api.hh.ru/employers/1175930',
'alternate_url': 'https://hh.ru/employer/1175930',
'logo_urls': {'90': 'https://hhcdn.ru/employer-logo/915014.jpeg',
'240': 'https://hhcdn.ru/employer-logo/915015.jpeg',
'original': 'https://hhcdn.ru/employer-logo-original/62311.JPG'},
'vacancies_url': 'https://api.hh.ru/vacancies?employer_id=1175930',
'trusted': True},
'snippet': {'requirement': 'Образование <highlighttext>повара</highlighttext>.',
'responsibility': 'Приготовление домашней (кошерной) еды. Закупка продуктов. Поддержание чистоты на кухне.'},
'contacts': None,
'schedule': {'id': 'fullDay', 'name': 'Полный день'},
'working_days': [],
'working_time_intervals': [],
'working_time_modes': [],
'accept_temporary': False}],
'found': 3700,
'pages': 200,
'per_page': 10,
'page': 0,
'clusters': None,
'arguments': None,
'alternate_url': 'https://hh.ru/search/vacancy?area=1&enable_snippets=true&items_on_page=10&text=%D0%9F%D0%BE%D0%B2%D0%B0%D1%80'}
# data scientist
URL = 'https://api.hh.ru/vacancies'
json_ds = []
for page in range(0, 4):
params = {
'text': "Data Scientist",
'area': 1,
'page': page,
'per_page': 100
}
req = requests.get(URL, params)
data = json.loads(req.content.decode())
json_ds += data['items']
Всппоминаем, какие столбцы нам нужны.
dataset_ds = pd.json_normalize(json_ds)[['id', 'name', 'employer.name', 'address.metro.station_name',
'address.metro.line_name', 'address.metro.lat', 'address.metro.lng', 'url']]
dataset_ds
| id | name | employer.name | address.metro.station_name | address.metro.line_name | address.metro.lat | address.metro.lng | url | |
|---|---|---|---|---|---|---|---|---|
| 0 | 44150000 | Стажер data scientist | СИБУР, Группа компаний | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44150000?host=hh.ru |
| 1 | 44132320 | Аналитик Data Scientist | Стоматорг | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44132320?host=hh.ru |
| 2 | 43896076 | Data Scientist в области компьютерного зрения | Fair Print & High Store | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43896076?host=hh.ru |
| 3 | 43471916 | Data Scientist / Quantitative Researcher | Знаменка Капитал | Кропоткинская | Сокольническая | 55.745297 | 37.604217 | https://api.hh.ru/vacancies/43471916?host=hh.ru |
| 4 | 43825932 | Junior Data Scientist | Институт прикладных экономических исследований... | Юго-Западная | Сокольническая | 55.663146 | 37.482852 | https://api.hh.ru/vacancies/43825932?host=hh.ru |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 322 | 43582504 | IT Recruiter | McKinsey & Company | Белорусская | Замоскворецкая | 55.777439 | 37.582107 | https://api.hh.ru/vacancies/43582504?host=hh.ru |
| 323 | 43513052 | Аналитик данных | ЛК Сименс Финанс | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43513052?host=hh.ru |
| 324 | 41733915 | Client Consultant (market research, FMCG sector) | NielsenIQ | Тушинская | Таганско-Краснопресненская | 55.825479 | 37.437024 | https://api.hh.ru/vacancies/41733915?host=hh.ru |
| 325 | 42916086 | Product Manager (Analytics) | Segmento | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/42916086?host=hh.ru |
| 326 | 42779428 | Java Developer (Система управления знаниями и ... | Сбербанк | Кутузовская | Филевская | 55.740544 | 37.534100 | https://api.hh.ru/vacancies/42779428?host=hh.ru |
327 rows × 8 columns
# обработка массива скиллов
def skills_parser(skills):
res = []
for l in range(len(skills)):
res.append(skills[l]['name'])
return res if res != [] else None
# добавление описаний и требований
descriptions_ds = []
success = 0
for cur_id in dataset_ds['id']:
cur_url = f'https://api.hh.ru/vacancies/{cur_id}'
cur_req = requests.get(cur_url)
if cur_req.status_code == 200:
success += 1
else:
print("error code")
cur_descr = json.loads(cur_req.content.decode())
descriptions_ds += [{'id' : cur_descr['id'],
'skills' : skills_parser(cur_descr['key_skills']),
'description' : cur_descr['description'],
'experience' : cur_descr['experience'],
'salary' : cur_descr['salary']}]
print("{} descriptions from {} got".format(success, len(dataset_ds)))
327 descriptions from 327 got
dataset_ds_descr = pd.json_normalize(descriptions_ds)
# объединение с предыдщуей таблицей
dataset_ds_all = pd.merge(dataset_ds_descr, dataset_ds, how='inner', left_on='id', right_on='id')
dataset_ds_all
| id | skills | description | salary | experience.id | experience.name | salary.from | salary.to | salary.currency | salary.gross | name | employer.name | address.metro.station_name | address.metro.line_name | address.metro.lat | address.metro.lng | url | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 44150000 | [Python, SQL, R, machine learning] | <p><strong>О НАС:</strong></p> <ul> <li>Одно и... | NaN | noExperience | Нет опыта | NaN | NaN | NaN | NaN | Стажер data scientist | СИБУР, Группа компаний | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44150000?host=hh.ru |
| 1 | 44132320 | [Python, MS Visio, Бизнес-анализ, Аналитически... | <p><em><strong>Компания Стоматорг - первая час... | NaN | between1And3 | От 1 года до 3 лет | 180000.0 | 250000.0 | RUR | True | Аналитик Data Scientist | Стоматорг | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44132320?host=hh.ru |
| 2 | 43896076 | [C++, Тестирование, MATLAB, Гарант плюс, Бизне... | <p>Стоимость работ: 150 000 рублей.</p> <p>Сро... | NaN | noExperience | Нет опыта | 150000.0 | 150000.0 | RUR | False | Data Scientist в области компьютерного зрения | Fair Print & High Store | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43896076?host=hh.ru |
| 3 | 43471916 | [Mathematical Statistics, Mathematical Program... | <strong>Обязанности:</strong> <ul> <li>Разрабо... | NaN | between3And6 | От 3 до 6 лет | 250000.0 | NaN | RUR | True | Data Scientist / Quantitative Researcher | Знаменка Капитал | Кропоткинская | Сокольническая | 55.745297 | 37.604217 | https://api.hh.ru/vacancies/43471916?host=hh.ru |
| 4 | 43825932 | [PyTorch, TensorFlow, Scikit-learn, xgboost, P... | <p><strong>Лаборатории анализа данных и отрасл... | NaN | between1And3 | От 1 года до 3 лет | 120000.0 | NaN | RUR | True | Junior Data Scientist | Институт прикладных экономических исследований... | Юго-Западная | Сокольническая | 55.663146 | 37.482852 | https://api.hh.ru/vacancies/43825932?host=hh.ru |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 322 | 43582504 | None | <p><strong>Qualifications:</strong></p> <ul> <... | NaN | between3And6 | От 3 до 6 лет | NaN | NaN | NaN | NaN | IT Recruiter | McKinsey & Company | Белорусская | Замоскворецкая | 55.777439 | 37.582107 | https://api.hh.ru/vacancies/43582504?host=hh.ru |
| 323 | 43513052 | [SQL, Английский язык, Статистический анализ, ... | <p>ООО ЛК «Сименс Финанс» (финансовое подразде... | NaN | between3And6 | От 3 до 6 лет | NaN | NaN | NaN | NaN | Аналитик данных | ЛК Сименс Финанс | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43513052?host=hh.ru |
| 324 | 41733915 | [Market Research, Маркетинговые исследования, ... | <p><strong>ABOUT THIS JOB</strong></p> <ul> <l... | NaN | between1And3 | От 1 года до 3 лет | NaN | NaN | NaN | NaN | Client Consultant (market research, FMCG sector) | NielsenIQ | Тушинская | Таганско-Краснопресненская | 55.825479 | 37.437024 | https://api.hh.ru/vacancies/41733915?host=hh.ru |
| 325 | 42916086 | [Python, Agile Project Management, Scrum, Goog... | <p>Segmento – одна из крупнейших российских pr... | NaN | between3And6 | От 3 до 6 лет | NaN | NaN | NaN | NaN | Product Manager (Analytics) | Segmento | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/42916086?host=hh.ru |
| 326 | 42779428 | [Git, Hibernate ORM, XML, Atlassian Jira, Java] | <p>Ищем разработчика на стартап внутри большой... | NaN | between1And3 | От 1 года до 3 лет | NaN | NaN | NaN | NaN | Java Developer (Система управления знаниями и ... | Сбербанк | Кутузовская | Филевская | 55.740544 | 37.534100 | https://api.hh.ru/vacancies/42779428?host=hh.ru |
327 rows × 17 columns
Конкретно в это месте стоит сказать, что анализировать 300 вакансий не очень разумно, поэтому было решено скачать больше, связанных так или иначе наукой о данных. Data Engineer и Data Analyst.
# Data Engineer
URL = 'https://api.hh.ru/vacancies'
json_de = []
for page in range(0, 10):
params = {
'text': "Data Engineer",
'area': 1,
'page': page,
'per_page': 100
}
req = requests.get(URL, params)
data = json.loads(req.content.decode())
json_de += data['items']
dataset_de = pd.json_normalize(json_de)[['id', 'name', 'employer.name', 'address.metro.station_name',
'address.metro.line_name', 'address.metro.lat', 'address.metro.lng', 'url']]
dataset_de
| id | name | employer.name | address.metro.station_name | address.metro.line_name | address.metro.lat | address.metro.lng | url | |
|---|---|---|---|---|---|---|---|---|
| 0 | 41469811 | Data Engineer | Айти-Солюшнс | Алексеевская | Калужско-Рижская | 55.807794 | 37.638699 | https://api.hh.ru/vacancies/41469811?host=hh.ru |
| 1 | 43907208 | Junior Data Engineer | Платформа ОФД | Лужники | МЦК | 55.720278 | 37.563056 | https://api.hh.ru/vacancies/43907208?host=hh.ru |
| 2 | 44160662 | AI / Machine Learning / Deep Learning Инженер | LuxPM | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44160662?host=hh.ru |
| 3 | 43841588 | Middle/Senior Data Engineer | App in the Air | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43841588?host=hh.ru |
| 4 | 42840765 | Data engineer | ДомКлик | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/42840765?host=hh.ru |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 958 | 43435157 | Head of Digital Marketing (US market) | Improvado | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43435157?host=hh.ru |
| 959 | 43419607 | Старший системный администратор | Инфосистемы Джет | Савеловская | Серпуховско-Тимирязевская | 55.794054 | 37.587163 | https://api.hh.ru/vacancies/43419607?host=hh.ru |
| 960 | 42650487 | Node.js разработчик (React, Vue) | DriverPack Solution | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/42650487?host=hh.ru |
| 961 | 43435894 | Digital Marketing Director | Валарм | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43435894?host=hh.ru |
| 962 | 43216639 | Инженер технической поддержки | СберМаркетинг | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43216639?host=hh.ru |
963 rows × 8 columns
# добавление описаний и требований
descriptions_de = []
success = 0
for cur_id in dataset_de['id']:
cur_url = f'https://api.hh.ru/vacancies/{cur_id}'
cur_req = requests.get(cur_url)
if cur_req.status_code == 200:
success += 1
else:
print("error code")
cur_descr = json.loads(cur_req.content.decode())
descriptions_de += [{'id' : cur_descr['id'],
'skills' : skills_parser(cur_descr['key_skills']),
'description' : cur_descr['description'],
'experience' : cur_descr['experience'],
'salary' : cur_descr['salary']}]
print("{} descriptions from {} got".format(success, len(dataset_de)))
dataset_de_descr = pd.json_normalize(descriptions_de)
# объединение с предыдщуей таблицей
dataset_de_all = pd.merge(dataset_de_descr, dataset_de, how='inner', left_on='id', right_on='id')
dataset_de_all
963 descriptions from 963 got
| id | skills | description | experience.id | experience.name | salary.from | salary.to | salary.currency | salary.gross | salary | name | employer.name | address.metro.station_name | address.metro.line_name | address.metro.lat | address.metro.lng | url | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 41469811 | [SQL, Английский язык, Работа в команде, Работ... | <p>Компания IT-Solutions приглашает на работу ... | between3And6 | От 3 до 6 лет | 250000.0 | NaN | RUR | False | NaN | Data Engineer | Айти-Солюшнс | Алексеевская | Калужско-Рижская | 55.807794 | 37.638699 | https://api.hh.ru/vacancies/41469811?host=hh.ru |
| 1 | 43907208 | None | <p><em><strong>Платформа ОФД – крупнейший в Ро... | between1And3 | От 1 года до 3 лет | 100000.0 | 150000.0 | RUR | False | NaN | Junior Data Engineer | Платформа ОФД | Лужники | МЦК | 55.720278 | 37.563056 | https://api.hh.ru/vacancies/43907208?host=hh.ru |
| 2 | 44160662 | [Java, C++, JUnit, Английский язык] | <p><strong>Who we are</strong></p> <p>We are a... | between1And3 | От 1 года до 3 лет | 250000.0 | 300000.0 | RUR | True | NaN | AI / Machine Learning / Deep Learning Инженер | LuxPM | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44160662?host=hh.ru |
| 3 | 43841588 | [Python, Git, Atlassian Jira, MySQL, SQL] | <p><strong>Кто мы? </strong></p> <p>Приложение... | between1And3 | От 1 года до 3 лет | 2000.0 | NaN | USD | False | NaN | Middle/Senior Data Engineer | App in the Air | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43841588?host=hh.ru |
| 4 | 42840765 | None | <p>В команду ДомКлик мы очень ждем Data engine... | between3And6 | От 3 до 6 лет | NaN | NaN | NaN | NaN | NaN | Data engineer | ДомКлик | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/42840765?host=hh.ru |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 958 | 43435157 | [B2B Marketing, Digital Marketing, Content Mar... | <p><strong>***Please note, we are looking for ... | between3And6 | От 3 до 6 лет | NaN | NaN | NaN | NaN | NaN | Head of Digital Marketing (US market) | Improvado | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43435157?host=hh.ru |
| 959 | 43419607 | [Администрирование серверов Linux, Atlassian C... | <p><strong>Компания «Инфосистемы Джет» — одна ... | moreThan6 | Более 6 лет | NaN | NaN | NaN | NaN | NaN | Старший системный администратор | Инфосистемы Джет | Савеловская | Серпуховско-Тимирязевская | 55.794054 | 37.587163 | https://api.hh.ru/vacancies/43419607?host=hh.ru |
| 960 | 42650487 | [Node.js, React.js, Babel, react, Vue, Vue.js,... | <p><strong>DriverPack - самый популярный серви... | moreThan6 | Более 6 лет | NaN | 300000.0 | RUR | False | NaN | Node.js разработчик (React, Vue) | DriverPack Solution | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/42650487?host=hh.ru |
| 961 | 43435894 | [Google Analytics, Google AdWords, Marketing C... | <p><strong>About Wallarm</strong></p> <p>Join ... | moreThan6 | Более 6 лет | 180000.0 | 250000.0 | RUR | False | NaN | Digital Marketing Director | Валарм | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43435894?host=hh.ru |
| 962 | 43216639 | [Active Directory, Разработка инструкций, Техн... | <p>СберМаркетинг (входит в экосистему Сбер) пр... | between1And3 | От 1 года до 3 лет | NaN | NaN | NaN | NaN | NaN | Инженер технической поддержки | СберМаркетинг | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43216639?host=hh.ru |
963 rows × 17 columns
# Data Analyst
URL = 'https://api.hh.ru/vacancies'
json_da = []
for page in range(0, 16):
params = {
'text': "Data Analyst",
'area': 1,
'page': page,
'per_page': 100
}
req = requests.get(URL, params)
data = json.loads(req.content.decode())
json_da += data['items']
dataset_da = pd.json_normalize(json_da)[['id', 'name', 'employer.name', 'address.metro.station_name',
'address.metro.line_name', 'address.metro.lat', 'address.metro.lng', 'url']]
dataset_da
| id | name | employer.name | address.metro.station_name | address.metro.line_name | address.metro.lat | address.metro.lng | url | |
|---|---|---|---|---|---|---|---|---|
| 0 | 43907208 | Junior Data Engineer | Платформа ОФД | Лужники | МЦК | 55.720278 | 37.563056 | https://api.hh.ru/vacancies/43907208?host=hh.ru |
| 1 | 44132320 | Аналитик Data Scientist | Стоматорг | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44132320?host=hh.ru |
| 2 | 41469811 | Data Engineer | Айти-Солюшнс | Алексеевская | Калужско-Рижская | 55.807794 | 37.638699 | https://api.hh.ru/vacancies/41469811?host=hh.ru |
| 3 | 44150000 | Стажер data scientist | СИБУР, Группа компаний | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44150000?host=hh.ru |
| 4 | 44146175 | Дата-аналитик/Data Analyst | Российская академия народного хозяйства и госу... | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44146175?host=hh.ru |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1557 | 43427055 | Аналитик отдела ценообразования | My Sky | Белорусская | Замоскворецкая | 55.777439 | 37.582107 | https://api.hh.ru/vacancies/43427055?host=hh.ru |
| 1558 | 42658993 | Database administrator/architect | LATOKEN | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/42658993?host=hh.ru |
| 1559 | 43434228 | Главный аналитик недвижимости, глава/руководит... | Пульс Продаж Новостроек | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43434228?host=hh.ru |
| 1560 | 43216639 | Инженер технической поддержки | СберМаркетинг | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43216639?host=hh.ru |
| 1561 | 42650460 | IT рекрутер | DriverPack Solution | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/42650460?host=hh.ru |
1562 rows × 8 columns
# добавление описаний и требований
descriptions_da = []
success = 0
for cur_id in dataset_da['id']:
cur_url = f'https://api.hh.ru/vacancies/{cur_id}'
cur_req = requests.get(cur_url)
if cur_req.status_code == 200:
success += 1
else:
print("error code")
cur_descr = json.loads(cur_req.content.decode())
descriptions_da += [{'id' : cur_descr['id'],
'skills' : skills_parser(cur_descr['key_skills']),
'description' : cur_descr['description'],
'experience' : cur_descr['experience'],
'salary' : cur_descr['salary']}]
print("{} descriptions from {} got".format(success, len(dataset_da)))
dataset_da_descr = pd.json_normalize(descriptions_da)
# объединение с предыдщуей таблицей
dataset_da_all = pd.merge(dataset_da_descr, dataset_da, how='inner', left_on='id', right_on='id')
dataset_da_all
1562 descriptions from 1562 got
| id | skills | description | experience.id | experience.name | salary.from | salary.to | salary.currency | salary.gross | salary | name | employer.name | address.metro.station_name | address.metro.line_name | address.metro.lat | address.metro.lng | url | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 43907208 | None | <p><em><strong>Платформа ОФД – крупнейший в Ро... | between1And3 | От 1 года до 3 лет | 100000.0 | 150000.0 | RUR | False | NaN | Junior Data Engineer | Платформа ОФД | Лужники | МЦК | 55.720278 | 37.563056 | https://api.hh.ru/vacancies/43907208?host=hh.ru |
| 1 | 44132320 | [Python, MS Visio, Бизнес-анализ, Аналитически... | <p><em><strong>Компания Стоматорг - первая час... | between1And3 | От 1 года до 3 лет | 180000.0 | 250000.0 | RUR | True | NaN | Аналитик Data Scientist | Стоматорг | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44132320?host=hh.ru |
| 2 | 41469811 | [SQL, Английский язык, Работа в команде, Работ... | <p>Компания IT-Solutions приглашает на работу ... | between3And6 | От 3 до 6 лет | 250000.0 | NaN | RUR | False | NaN | Data Engineer | Айти-Солюшнс | Алексеевская | Калужско-Рижская | 55.807794 | 37.638699 | https://api.hh.ru/vacancies/41469811?host=hh.ru |
| 3 | 44150000 | [Python, SQL, R, machine learning] | <p><strong>О НАС:</strong></p> <ul> <li>Одно и... | noExperience | Нет опыта | NaN | NaN | NaN | NaN | NaN | Стажер data scientist | СИБУР, Группа компаний | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44150000?host=hh.ru |
| 4 | 44146175 | [Python, SQL, Adobe Photoshop, Аналитические и... | <p>В проект, реализуемый совместно со Счетной ... | between1And3 | От 1 года до 3 лет | 120000.0 | 150000.0 | RUR | False | NaN | Дата-аналитик/Data Analyst | Российская академия народного хозяйства и госу... | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44146175?host=hh.ru |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1557 | 43427055 | [Базы данных, MS Excel, Английский язык] | <p><strong>MySky </strong>– международная инно... | between1And3 | От 1 года до 3 лет | NaN | NaN | NaN | NaN | NaN | Аналитик отдела ценообразования | My Sky | Белорусская | Замоскворецкая | 55.777439 | 37.582107 | https://api.hh.ru/vacancies/43427055?host=hh.ru |
| 1558 | 42658993 | [Databases, Python, MySQL, SQL, Analytical ski... | <p>LATOKEN’s mission is to <strong>put financi... | noExperience | Нет опыта | 200000.0 | NaN | RUR | False | NaN | Database administrator/architect | LATOKEN | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/42658993?host=hh.ru |
| 1559 | 43434228 | [Аналитические исследования, Мониторинг рынка,... | <p>Аналитический сервис «Пульс Продаж Новостро... | between1And3 | От 1 года до 3 лет | 100000.0 | 150000.0 | RUR | False | NaN | Главный аналитик недвижимости, глава/руководит... | Пульс Продаж Новостроек | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43434228?host=hh.ru |
| 1560 | 43216639 | [Active Directory, Разработка инструкций, Техн... | <p>СберМаркетинг (входит в экосистему Сбер) пр... | between1And3 | От 1 года до 3 лет | NaN | NaN | NaN | NaN | NaN | Инженер технической поддержки | СберМаркетинг | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43216639?host=hh.ru |
| 1561 | 42650460 | [Подбор персонала, Адаптация персонала, Активн... | <p>Привет!</p> <p>Я, Артур Кузяков, основатель... | noExperience | Нет опыта | NaN | NaN | NaN | NaN | NaN | IT рекрутер | DriverPack Solution | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/42650460?host=hh.ru |
1562 rows × 17 columns
Пришло время слить все воедино. Название dataset_ds_all останется.
dataset_ds_all = pd.concat([dataset_ds_all, dataset_de_all, dataset_de_all], ignore_index=True)
dataset_ds_all.drop_duplicates(subset='id', keep='first', inplace=True)
dataset_ds_all.to_csv('dataset_ds_all.csv')
2. Анализ и визуализация данных
Проведите исследование получившихся данных. Прежде всего убедитесь, что ваши данные чистые. Убедитесь, что вы проделали следующее:
Среди вакансий можно выделять группы. Например, бизнес-аналитик, BI аналитик, продуктовый аналитик.
Ответьте не следующие вопросы:
Не забудьте про визуализацию — для этого используйте библиотеку plotly. Постройте следующие графики:
Для построения последних двух графиков вам могут понадобиться внешние данные.
# Значит, дубликатов нет
dataset_ds_all['id'].duplicated().sum()
0
for col in dataset_ds_all.columns:
print("<{}> column has {} NaNs".format(col, len(dataset_ds_all[dataset_ds_all[col].isna()])))
<id> column has 0 NaNs <skills> column has 229 NaNs <description> column has 0 NaNs <salary> column has 1174 NaNs <experience.id> column has 0 NaNs <experience.name> column has 0 NaNs <salary.from> column has 984 NaNs <salary.to> column has 1054 NaNs <salary.currency> column has 954 NaNs <salary.gross> column has 954 NaNs <name> column has 0 NaNs <employer.name> column has 0 NaNs <address.metro.station_name> column has 767 NaNs <address.metro.line_name> column has 767 NaNs <address.metro.lat> column has 767 NaNs <address.metro.lng> column has 767 NaNs <url> column has 0 NaNs
Предобработка:
Видно, что основная проблема с пропусками в информации о зарплате. Насколько можно судить по данным, почти везде составители описаний вакансий указывают неполную вилку(либо верхнюю, либо нижнюю границы). Вместо пустой зарплаты указывать какое-то число - значит, сместить оценку, а если обрабатывать только полные данные, получим слишком маленькую выборку.Поэтому придется оставить так.
Часто не указывают валюту(будем считать, что там рубли).
Если не указывают до вычета налогов или нет, будем считать, что до вычета.
Пустую колонку salary просто дропнем.
dataset_ds_all = dataset_ds_all.drop(['salary'], axis=1)
dataset_ds_all['salary.currency'] = dataset_ds_all['salary.currency'].apply(lambda x : 'RUR' if pd.isna(x) else x)
dataset_ds_all['salary.gross'] = dataset_ds_all['salary.gross'].apply(lambda x : True if pd.isna(x) else x)
# Всего вакансий столько
len(dataset_ds_all)
1174
# ищу группы вакансий
list_of_names_ds = []
def name_parser(name):
name = name.lower()
name = name.replace('\xa0', ' ')
name = name.replace('стажер', '')
name = name.replace('старший', '')
name = name.replace('средний', '')
name = name.replace('младший', '')
name = name.replace('intern', '')
name = name.replace('junior', '')
name = name.replace('middle', '')
name = name.replace('senior', '')
name = name.replace('team', '')
name = name.replace('lead', '')
zero_split = name.split(',')
for zero in zero_split:
fisrt_split = zero.split('/')
for first in fisrt_split:
second_split = first.split('(')
for second in second_split:
third_split = second.split(')')
for n in third_split:
s = list(n)
if len(s) > 0:
if s[0] == ' ':
s[0] = ''
if s[len(s) - 1] == ' ':
s[len(s) - 1] = ''
n = "".join(s)
if n != '':
n = n.replace(' data scientist', 'data scientist')
n = n.replace('data scientists', 'data scientist')
list_of_names_ds.append(n)
# группы вакансий
for name in dataset_ds_all['name']:
name_parser(name)
dict(sorted(Counter(list_of_names_ds).items(), key=lambda item: -item[1]))
{'data scientist': 176,
'data engineer': 169,
'remote': 26,
'qa engineer': 25,
'data analyst': 22,
'python': 20,
'big data': 19,
'devops инженер': 15,
'qa automation engineer': 14,
'ml engineer': 13,
'devops engineer': 12,
'аналитик данных': 11,
'java developer': 11,
'python developer': 10,
'product manager': 10,
'java': 10,
'aws': 9,
'devops': 9,
'sberdevices': 8,
'кипр': 7,
'data science': 7,
'аналитик': 7,
'software engineer': 7,
'product analyst': 7,
'инженер данных': 6,
'разработчик': 6,
'инженер devops': 6,
'c++ developer': 6,
'ml': 5,
'nlp': 5,
'machine learning engineer': 5,
'data scientist nlp': 5,
'product owner': 5,
'cyprus': 5,
'sql': 5,
'project manager': 5,
'react': 5,
'dwh': 5,
'hadoop': 5,
'manual qa engineer': 5,
'разработчик etl': 5,
'инженер технической поддержки': 5,
'data инженер': 4,
'data аналитик': 4,
'системный аналитик': 4,
'data': 4,
'удаленно': 4,
'support engineer': 4,
'qa инженер': 4,
'backend developer': 4,
'business analyst': 4,
'frontend developer': 4,
'продуктовый аналитик': 4,
'инженер эксплуатации': 4,
'инженер по поддержке бизнес-приложений': 4,
'дата-инженер': 4,
'программист': 4,
'computer vision': 3,
'recommender systems': 3,
'блок управление благосостоянием': 3,
'researcher': 3,
'python разработчик': 3,
'аналитик bi': 3,
'fullstack developer': 3,
'head of analytics': 3,
'it recruiter': 3,
'ai': 3,
'to canada': 3,
'big data engineer': 3,
'etl': 3,
'backend engineer': 3,
'developer': 3,
'backend': 3,
'analyst': 3,
'linux': 3,
'сетевой инженер': 3,
'solution architect': 3,
'limassol': 3,
'ипотека': 3,
'web': 3,
'of analytics': 3,
'mobile': 3,
'зарплатные проекты': 3,
'quantitative researcher': 2,
'бизнес-аналитик': 2,
'аналитик-разработчик': 2,
'эксперт': 2,
'ai lab': 2,
'deep learning engineer': 2,
'layer': 2,
'цк кхд': 2,
'\\': 2,
'команда ису': 2,
'специалист по рекомендательным сервисам': 2,
'цкм': 2,
'тeam команды по адаптированию': 2,
'коммерческое направление': 2,
'pfm': 2,
'эконометрическое моделирование': 2,
'remote option': 2,
'businessdata scientist': 2,
'capital markets': 2,
'берлин': 2,
'брауншвайг': 2,
'- syntagma': 2,
' data science': 2,
'tech': 2,
'nlp engineer': 2,
'bigdata': 2,
'django': 2,
'цифровой кредитный мониторинг': 2,
'android developer': 2,
'разработчик python': 2,
'руководитель проектов': 2,
'usd salary': 2,
'tech data engineer': 2,
'gamedev': 2,
'etl разработчик': 2,
'etl developer': 2,
'data science инженер': 2,
'c++': 2,
'product analytics': 2,
'дкк 360': 2,
'дтб': 2,
'data engineering': 2,
'database engineer': 2,
'dba': 2,
'architect': 2,
'oracle dba': 2,
'data hunter': 2,
'аналитик данных цифровых продуктов': 2,
'technical support engineer': 2,
'software developer c++': 2,
'sales engineer': 2,
'ruby': 2,
'new product': 2,
'product manager в rusprofile': 2,
'core product': 2,
'ux': 2,
'vue': 2,
'application security engineer': 2,
'video editor': 2,
'микросервисы': 2,
'developer c#': 2,
'technical support specialist': 2,
'инженер': 2,
'front-end developer': 2,
'системный архитектор': 2,
'ит-инфраструктура': 2,
'oracle': 2,
'developer in test': 2,
'ведущий сетевой инженер': 2,
'инженер по данным': 2,
'java разработчик': 2,
'инженер по информационной безопасности': 2,
'code reviewer': 2,
'node.js': 2,
'go developer': 2,
'ведущий инженер': 2,
'full-stack developer': 2,
'golang': 2,
'uzbekistan': 2,
'kubernetes': 2,
'remote work': 2,
'marketing': 2,
' site reliability engineer': 2,
'rider app': 2,
'automation': 2,
'driver app': 2,
'аналитика цен и ассортимента': 2,
'администратор серверов приложений': 2,
'ml-инженер': 2,
'инженер по сопровождению абс сзп': 2,
'менеджер по работе с ключевыми клиентами': 2,
'инженер по поддержке микросервисов': 2,
'аналитикdata scientist': 1,
'data scientist в области компьютерного зрения': 1,
'quantitative analyst': 1,
'cv data scientist': 1,
'аналитик data science': 1,
'в консалтинг': 1,
'data scientist в команду прогнозирования спроса яндекс.маркета': 1,
'ведущий аналитикdata scientist': 1,
'цифровые помощники': 1,
'электронный документооборот': 1,
'quantitative research': 1,
'london': 1,
'цифровые двойники': 1,
'relocation': 1,
'computer vision advanced research': 1,
'or': 1,
'computer visiondata scientist': 1,
'руководитель группы data инженеров': 1,
'chief data engineer': 1,
' программист-исследователь': 1,
'delivery club': 1,
'report developer': 1,
'data scientist в отдел моделей кредитного риска кб и мсб': 1,
'data scientist + продуктовый аналитик': 1,
'команда продажи авиабилетов': 1,
'data scientist в mytracker': 1,
'ml engineer в отдел моделирования cvm': 1,
' data science': 1,
'ml - разработчик': 1,
'исследователь данных': 1,
'nlp researcher': 1,
' data analyst': 1,
'в команду cvm & ai дивизион «особенные решения»': 1,
'клиентские сервисы': 1,
'knowledge assistant': 1,
' speech analytics': 1,
'data scientist in nlp': 1,
'mid': 1,
'cv': 1,
'classicml': 1,
'research scientist': 1,
'advanced data analytics in science and engineering': 1,
'larss laboratory': 1,
'управление валидации': 1,
'sr manager data science': 1,
'data scientist на направление персонализации сервисов': 1,
'группа улучшения бизнес-технологии и ит': 1,
'инженер в области машинного обучения': 1,
'директор': 1,
'управление модельных рисков и валидации': 1,
'центр валидации моделей сервисных блоков и экосистемы': 1,
'data scientist в проект «онлайн-оценка недвижимости»': 1,
'payments': 1,
'anti-fraud': 1,
'south-eastern europe': 1,
'разработчик рекомендательных систем': 1,
'marketing analyst -data scientist': 1,
'преподаватель по data science': 1,
'hr-платформа': 1,
'rec-sys. hr-платформа': 1,
'corporate customers 360': 1,
'ds developer в команду external data modeling and research': 1,
'товарные рекомендации': 1,
'корпоративный блок': 1,
'доработке batch- моделей': 1,
'команда поиска': 1,
'data scientist по построению моделей оценки кредитного риска для клиентов мсб': 1,
'data scientist в команду генетики': 1,
'data scientist в управление розничного моделирования': 1,
'маркетолог-аналитик': 1,
'веб аналитик': 1,
'команда вэд_ds': 1,
'data scientist nlp. дивизион `массовая персонализация`': 1,
'cv-алгоритмы': 1,
'проверяющий преподаватель на курс "data scientist"': 1,
'специалист по data science': 1,
'price and assortment monitoring': 1,
'автоматический матчинг': 1,
'дивизион `массовая персонализация`': 1,
'портфельное моделирование': 1,
'research scientist for multiphase flow metering': 1,
'доработке моделей': 1,
'персонализация витрин': 1,
'data scientist - команда cltv. дивизион `массовая персонализация`': 1,
'data scientist в команду crm': 1,
'customer facingdata scientist': 1,
'clouddata scientist': 1,
'research scientist for reservoir engineering data analytics': 1,
'математик': 1,
'data analytics consultant': 1,
'siem': 1,
'data scientist at sber corporate': 1,
'управление продажами в субъектах рф': 1,
'big-data & hpc scientist': 1,
'product data analyst': 1,
'perm': 1,
'b2bdata scientist': 1,
'автомодерация': 1,
'поиск': 1,
'data scientist в команду трайба «эквайринг»': 1,
'probabilistic modelling': 1,
'руководитель направления по аналитике данных': 1,
'technical в data science-команду': 1,
'data scientist в команду комплаенс-контроля': 1,
'ai разработчик': 1,
'ai researcher': 1,
'sourcer': 1,
'machine learning developer': 1,
'менеджер проектов в направлении big data': 1,
'scheduling algorithms': 1,
'администратор и разработчик платформы больших данных': 1,
'менеджер продукта биометрии': 1,
'operations research and optimization': 1,
'medical advisor': 1,
'medical science liaison': 1,
'программист python': 1,
'аналитик по управлению данными': 1,
'new business development manager': 1,
'разработчик bi-dwh': 1,
'ведущий инженер больших данных': 1,
'java-разработчик +': 1,
'pandaomics global product manager': 1,
'head of hr': 1,
'marketing bi analytics': 1,
'единый виртуальный ассистент сотрудника': 1,
'аналитик клиентской базы данных': 1,
'student guidance manager': 1,
'usa': 1,
'at practicum by yandex': 1,
'инженер ml-разработки': 1,
'pydata': 1,
'nodejs разработчик': 1,
'аналитик-математик': 1,
'фронтэндер на js': 1,
'redux': 1,
'владелец продукта для внутренних data&analytics продуктов магнит': 1,
'преподаватель курса машинное обучение': 1,
'аналитик sql': 1,
'search engineer': 1,
'devops engineer в команду data lake': 1,
'задачи по технологической оптимизации': 1,
'специалист по анализу данных': 1,
' ds': 1,
'руководитель отдела разработки по - headdev': 1,
'руководитель отдела разработки по': 1,
'web analyst': 1,
'google analytics evangelist': 1,
'full stack developer': 1,
'андроид разработчик': 1,
'эксперт в управление розничного моделирования': 1,
'директор по маркетингу': 1,
'разработка моделей оценки кредитного риска для клиентов малого и среднего бизнеса': 1,
'архитектор данных dwh': 1,
'специалист по продвижению бренда работодателя': 1,
'talent brand': 1,
'assistant for client development': 1,
'департамента маркетинга и коммуникаций': 1,
'python-разработчик': 1,
'рекрутер': 1,
'market analyst': 1,
'consumer insights client consultant': 1,
'quantitative': 1,
'client consultant': 1,
'market research': 1,
'fmcg sector': 1,
'analytics': 1,
'система управления знаниями и поиск': 1,
'machine learning': 1,
'deep learning инженер': 1,
'software developer - search': 1,
'data engineer - sales home': 1,
'data engineer департамента машинного обучения и работе с данными': 1,
'java engineer - trade finance & lending data': 1,
'php developer': 1,
'reverse engineering': 1,
'principal software engineer': 1,
'data engineer - trade finance': 1,
'build engineer': 1,
'azure pipelines': 1,
'казначейство': 1,
'aws data architect': 1,
'sber process mining': 1,
'разработчик informatica data engineering': 1,
'интеграция данных': 1,
'qa engineer - risk finder data services': 1,
'full-stack software engineer': 1,
'data integration engineer': 1,
'data science sap': 1,
'big data инженер': 1,
'аналитик по работе с источниками данных': 1,
'eda data analyst': 1,
'big data developer': 1,
'еисжс': 1,
'data engineer в bi': 1,
'мониторинг моделей big data': 1,
'business intelligence data engineer': 1,
'data operations engineer': 1,
'data engineer sberdevices': 1,
'predictive': 1,
'data engineer в команду retailreporting': 1,
'qa-инженер': 1,
'разработка витрин в облаке данных': 1,
'analytics core': 1,
'data engineer with sql': 1,
'machine learning engineer на computer vision направление': 1,
'devops инженер - data river': 1,
'data developer': 1,
'с++ database engineer': 1,
'big data machine learning algorithm engineer': 1,
'calibration engineer': 1,
'3d computer vision': 1,
'специалист по автоматизации данных': 1,
'dataops': 1,
'support engineer l3': 1,
'rf algorithm software engineer': 1,
'ведущий инженер данных': 1,
'kaldi': 1,
'devops-engineer': 1,
'java backend': 1,
'product analytics platform': 1,
'платформа больших данных': 1,
'управление противодействия кибермошенничеству': 1,
'data warehouse engineer': 1,
'data-инженер': 1,
'dispatch': 1,
'гео-аналитика': 1,
'linux technical support engineer for cloudlinuxos': 1,
'isap': 1,
'data-engineer': 1,
'etl специалист': 1,
'qa automatization engineer': 1,
'etl engineer': 1,
'engineer': 1,
'al technical support engineer [remote]': 1,
'руководитель группы': 1,
'+': 1,
'ml-инженер в команду big data': 1,
'data engineer. направление customer lifetime value. дивизион `массовая персонализация`': 1,
'data engineering ': 1,
'data-инженер хранилищ данных': 1,
'data engineering developer': 1,
'разработчик витрин в облаке данных': 1,
'комплаенс': 1,
'data engineer tech': 1,
' data engineer': 1,
'spark cloud data engineer': 1,
'dl ml nlp': 1,
'bert': 1,
'ml - инженер в команду big data': 1,
'витрины данных': 1,
'инженер-программист python': 1,
'инженер-сопровождения data science-платформы': 1,
'ведущий исследователь данных': 1,
'data quality analyst': 1,
'sberseasons': 1,
'business intelligence engineer': 1,
'dbd': 1,
'big-data & hpc research engineer': 1,
'продуктовое направление': 1,
'удаленно или офис в москве': 1,
'аналитик баз данных': 1,
'bigdata и ml': 1,
'software developer': 1,
'data platform': 1,
'маркетинг киб': 1,
'qa инженер в bigdata': 1,
'data engineer в центр риск-технологий': 1,
'менеджер по анализу больших данных': 1,
'etl support engineer': 1,
'azure data': 1,
'big-data and hpc research engineer': 1,
'deep learning tools software engineer': 1,
'специалист ручного тестирования': 1,
'business intelligence analyst': 1,
'presales engineer': 1,
'тестировщик по': 1,
' qa engineer': 1,
'qa engineer - rates and credit post trade': 1,
'qa - engineer': 1,
'web-developer': 1,
'инженер по тестированию': 1,
'devops инженер ci': 1,
'cd': 1,
'apache nifi': 1,
'database architect': 1,
'бэк-энд разработчик': 1,
'qa engineer - rates and credit pots trade': 1,
'golang engineer': 1,
'core transactions & crypto': 1,
'специалист по автоматизированному тестированию': 1,
'разработчик на python в команду data management platform': 1,
'distributed systems engineer': 1,
'devsecops engineer': 1,
'java engineer - sec lending espear': 1,
'node.js engineer': 1,
'cube cloud': 1,
'java software engineer': 1,
'1-day hiring event': 1,
'software developer for multiphase flow metering': 1,
'java developer - autoblotter reporting': 1,
'head of infrastructure': 1,
'специалист по web-pentest': 1,
'rtb manager - fx4cash': 1,
'technical ': 1,
'open source': 1,
'technical': 1,
'cloud platform': 1,
'software developer - web-based applications': 1,
'backend software engineer': 1,
'erlang с': 1,
'с++': 1,
'functional analyst - cb liquidity': 1,
'commissioning & startup engineer': 1,
'full-stack web engineer': 1,
'hadoop-инженер': 1,
'продуктовый аналитик - risks': 1,
'разработчик c# backend developer': 1,
'salesforce engineer': 1,
'аналитик качества данных': 1,
'инженер-исследователь': 1,
'ios engineer': 1,
'swift': 1,
'sales manager of semiconductor': 1,
'analytical equipment': 1,
'системный аналитик на проект mobile id': 1,
'ui developer - autoblotter reporting': 1,
'ror+react': 1,
' analytics': 1,
'java developer - xol': 1,
'commissioning mechanical engineer': 1,
'удаленно на постоянной основе': 1,
'java-разработчик в evrone': 1,
'web developer – autoblotter': 1,
'dwh разработчик': 1,
'computing hardware': 1,
'it business manager': 1,
'frontend react developer': 1,
'quik system administrator': 1,
'db': 1,
'api': 1,
'activity and market analysis manager': 1,
'online payments': 1,
'engineering manager': 1,
'ios developer': 1,
'системный инженер': 1,
'product designer': 1,
'ruby developer': 1,
'ui artist': 1,
'с++ разработчик': 1,
'video processing': 1,
'software engineer c#': 1,
'.net core': 1,
'antifraud': 1,
'разработчик по автоматизации тестирования в систему управления профилями участников': 1,
'frontend developer - trade finance': 1,
'специалист по ханипотам': 1,
'novakid product manager': 1,
'quality specialist': 1,
'spmat specialist': 1,
'reviewer': 1,
'ui дизайнер': 1,
'методист онлайн-курсов': 1,
'инженер 2-й линии технической поддержки': 1,
'supply chain specialist with oil & gas': 1,
'ui designer \u200e': 1,
'russia data driven ambassador': 1,
'ui': 1,
'ux designer': 1,
'interactive agency': 1,
'head of user acquisition': 1,
'system architect': 1,
'unix': 1,
'pos': 1,
'public clouds': 1,
'marketing assistant for tuxcare': 1,
'windows 10': 1,
'код-ревьюер на программу обучения " frontend developer" в яндекс.практикум': 1,
'fullstack developer - sales home': 1,
'qa automation': 1,
'marketing manager for tuxcare support services [remote]': 1,
'infrastructure engineer': 1,
'cy': 1,
'преподаватель учебного центра': 1,
'it и информационная безопасность': 1,
'tax specialist': 1,
'tax operations': 1,
'frontend-разработчик': 1,
'2d concept artist': 1,
'new mobile product': 1,
'руководитель направления «телеком»': 1,
'quality assurance and regulatory affairs er': 1,
'python разработчик в sberdevices': 1,
'команда аналитики данных виртуального ассистента': 1,
'инженер по ручному тестированию': 1,
'atlassian engineer': 1,
'digital marketing specialist': 1,
'руководитель отдела аналитики': 1,
'ведущий инженер по ручному тестированию': 1,
'area sales manager brewing & malting': 1,
'information security engineer': 1,
'mobile applications security engineer': 1,
'devsec engineer': 1,
'java microservice expert - cloud software development': 1,
'marketing director': 1,
'эксплуатация': 1,
'content manager': 1,
'copywriter': 1,
'energy infrastructure design manager': 1,
'руководитель отдела проектирования': 1,
'chief product officer': 1,
'омниканальность': 1,
'social media and pre-sales specialist': 1,
'специалист по ручному тестированию': 1,
'проект единый реестр населения': 1,
'account executive': 1,
'программист-разработчик': 1,
'head of it department': 1,
'machine tools': 1,
'automotive industries': 1,
'measurement technology': 1,
'maintenance planner': 1,
' специалист по планированию техобслуживания рудника': 1,
'архитектор dwh': 1,
'инженер поддержки': 1,
'support': 1,
'magento developer': 1,
'sap hcm consultant': 1,
'py': 1,
'pt': 1,
'mysql administrator': 1,
'приложение самокат': 1,
'technical solutions specialist': 1,
'руководитель развития процессов и сервисов для банковских карт и эквайринга': 1,
'it recruitment specialist for anotech russia': 1,
'sqa packs technologist': 1,
'mobile & web': 1,
'разработчик hadoop': 1,
'банк': 1,
'афиша': 1,
'рамблер касса': 1,
'crm product owner': 1,
'salesforce': 1,
'relocation to kuala lumpur': 1,
'virtualization software engineer': 1,
'автоматизация devops': 1,
'архитектор данных': 1,
'мтс маркетолог': 1,
'strategy analyst': 1,
'специалист по расчету взлетно-посадочных характеристик': 1,
'expert business analyst sap bw & hana': 1,
'менеджер программы трудоустройства студентов': 1,
'it рекрутер': 1,
'operating accountant': 1,
'digital marketing': 1,
'hadoop devops': 1,
'продуктовый дизайнер': 1,
'design er – low voltage': 1,
'design er – medium voltage': 1,
'network engineer': 1,
'инженер-проектировщик наружных сетей': 1,
'researcher of network algorithm and modeling': 1,
'инженер группы эксплуатации сети': 1,
'outsourcing project manager': 1,
'антирекрутер': 1,
'руководитель отдела разработки и интеграции аналитических систем': 1,
'менеджер команды сопровождения в яндекс.практикум': 1,
'application engineer': 1,
'главный аналитик данных': 1,
'web-разработчик': 1,
'account manager': 1,
'инженер-проектировщик openstack': 1,
'javascript software engineer': 1,
'crm insight analyst': 1,
'e-commerce': 1,
'инженер sre': 1,
'разработчик sql': 1,
'ведущий разработчик': 1,
'tarantool delivery': 1,
'2 линия': 1,
'ведущий инженер по разработке программного обеспечения': 1,
'lua developer': 1,
'cost engineer': 1,
' специалист по расчету затрат': 1,
'business logic': 1,
' trading desk c#': 1,
'специалист по внедрению емиас': 1,
'инженер технической поддержки емиас': 1,
'руководитель направления маркетинговой аналитики и cvm': 1,
'moscow': 1,
'dxfeed': 1,
'эксплуатация и инфраструктура рекламных технологий': 1,
'compiler engineer': 1,
'recruiter': 1,
'r&d': 1,
'systems analyst': 1,
'client incentives': 1,
'qa analyst': 1,
'руководитель отдела системно-технического обеспечения': 1,
'analyst developer siebel crm and crm systems': 1,
'javascript': 1,
'instrumentation engineer': 1,
'devops-инженер': 1,
'ведущий инженер по нагрузочному тестированию': 1,
'software architect': 1,
'frontend': 1,
'cloud': 1,
'ведущий инженер web-разработки': 1,
'electrical engineer': 1,
'etl-разработчик': 1,
'digital analyst': 1,
'manager software development': 1,
'marketing specialist': 1,
'industrial sphere': 1,
'редактор онлайн-курса по тестированию': 1,
'qa': 1,
"'корпоративные клиенты 360'": 1,
'инженер сопровождения автоматизированных банковских систем и приложений': 1,
'sales director': 1,
' asia': 1,
'директор по продуктовой аналитике': 1,
'сетевые технологии': 1,
'разработчик bigdata': 1,
'batch': 1,
'аналитик развития процессов работы с данными': 1,
'инженер сопровождения тестовых стендов': 1,
'devops - инженер': 1,
'docker': 1,
'android engineer': 1,
'driver apps': 1,
'sw qa engineer': 1,
'automation qa engineer': 1,
'gnu': 1,
'менеджер проектов по трудоустройству выпускников онлайн-курсов': 1,
'ror developer': 1,
'sales support': 1,
'automotive industry': 1,
'go': 1,
'региональная сеть': 1,
'.net core backend developer': 1,
'ipp sw engineer': 1,
'elv engineer': 1,
'mega belaya dacha': 1,
'supervisor planning fulfilment hub': 1,
'пушкино': 1,
'развитие транспортных сетей dwdm': 1,
'клиентская аналитика': 1,
'pre-sale инженер': 1,
'лид направления миграции данных': 1,
'director of product': 1,
'saas': 1,
'инженер database security': 1,
'dam': 1,
'bi-аналитик': 1,
'services marketing and business growth manager': 1,
'python+selenium': 1,
'expert product analyst': 1,
'java engineer': 1,
'дата инженер': 1,
'дата аналитик в управление модельных рисков и валидации': 1,
'business development manager': 1,
' sre': 1,
'system platform integrations support engineer': 1,
'it-recruiter': 1,
'business analyst \\ project manager': 1,
'ml инженер': 1,
'email marketing manager': 1,
'helpdesk': 1,
'full stack python разработчик': 1,
'head digital marketing manager': 1,
'инженер по сопровождению абс м-банк': 1,
'financial analyst': 1,
'инженер по поддержке бизнес-процессов': 1,
'рко': 1,
'front-end engineer': 1,
'ios разработчик': 1,
'contracts administrator': 1,
'atlassian products: jira': 1,
'confluence': 1,
'corp brokerage': 1,
'php - backend developer': 1,
'проект research': 1,
'инженер сопровождения по': 1,
'devops + oracle + ibm': 1,
'structural sub- engineer kz': 1,
'customer experience manager': 1,
'chief mining engineer': 1,
'africa': 1,
'сетевой инженер цод': 1,
'управленческая отчётность': 1,
'инженер по работе с данными': 1,
'риск-аналитик': 1,
'розничные кредитные риски': 1,
'tender and contract manager': 1,
'logistics': 1,
'сетевой инженер noc': 1,
'инженер по поддержке систем кредитования': 1,
'marketing strategist for expo and online education': 1,
'predictive analytic solutions': 1,
'full-stack node.js developer': 1,
'кам': 1,
'инженер по сопровождению облачной платформы': 1,
'head of product': 1,
'pricing': 1,
'ведущий системный инженер': 1,
'c# developer': 1,
'subcontracts administrator': 1,
'руководитель проекта': 1,
'oracle developer': 1,
'penetration tester': 1,
'offensive security engineer': 1,
'руководитель ит-проектов': 1,
'hadoop engineer': 1,
'specialist': 1,
'revenue management': 1,
'smm specialist for expo': 1,
'chief operating officer': 1,
'coo': 1,
'редактор онлайн-курса по go-разработке': 1,
'инженер по обслуживанию оборудования ит-инфраструктуры в цод': 1,
'qa engineer java': 1,
'главный инженер корпоративной системы по управлению мощностями ит': 1,
'.net разработчик': 1,
'удаленно с финляндией': 1,
'logistics specialist': 1,
'tenders&contracts': 1,
'инженер технического presales': 1,
'инженер технической поддержки с немецким': 1,
'manual qa': 1,
'exploratory & regression testing': 1,
'recruitment specialist': 1,
'devops ': 1,
'bi эксперт': 1,
'департамент внутреннего аудита': 1,
'piping design engineer': 1,
'omsk': 1,
'applications support engineer': 1,
'modern workplace solution architect': 1,
'digital account manager \\perfomance marketing manager': 1,
'security researcher': 1,
'great': 1,
'business analyst – client onboarding operations': 1,
'инженер по автоматизации тестирования по': 1,
'data engineer в команду «маркетинга и коммуникаций»': 1,
'инженер по разработке программного обеспечения': 1,
'java developer - client onboarding operations': 1,
'production engineer': 1,
'java ': 1,
'java-программист': 1,
'golang developer - client onboarding operations': 1,
'it architect': 1,
'системный аналитик в miraccept': 1,
'инфраструктура': 1,
'kotlin': 1,
'infrastructure security engineer': 1,
'relocation to cyprus': 1,
'fuel': 1,
'developer relations manager': 1,
'architectural sub- engineer ar': 1,
'seoul': 1,
'south korea': 1,
'3d machine learning research and development engineer': 1,
'sales manager': 1,
'+ frontend разработчик': 1,
'ember': 1,
'c финляндией': 1,
'technical project manager': 1,
'ведущий инженер технической поддержки': 1,
'fp&a analyst': 1,
'pre-sales engineer': 1,
'business consultant': 1,
'инженер-аналитик': 1,
'linux инженер': 1,
'consultant - mtwo': 1,
'инженер сопровождения системы обработки исполнительных документов': 1,
'graphics': 1,
'image processing': 1,
'smartvista integration platform': 1,
'системный архитектор bi': 1,
'salesforce integration developer': 1,
'technical ': 1,
'genesys': 1,
'learning and development professional': 1,
'архитектор отдела mes-архитектуры': 1,
'java+angular': 1,
'operations manager': 1,
'kotlin software engineer': 1,
'estimator': 1,
'industrial safety engineer': 1,
'integration professional ip': 1,
'mpls': 1,
'software product manager': 1,
'inside account executive': 1,
'germany - stay home': 1,
'join veeam!': 1,
'трайб фронтальных решений': 1,
'архитектор решений': 1,
'scala разработчик': 1,
'digital marketing manager': 1,
'performance marketing manager': 1,
'trading analyst': 1,
'разработчик на c++': 1,
'unreal engine': 1,
'business relationship executive': 1,
'bi': 1,
'с++ software developer': 1,
'technical account manаger': 1,
'global': 1,
'ведущий java-разработчик': 1,
'ведущий java разработчик': 1,
'ios-developer': 1,
'депозитарий': 1,
'java инженер': 1,
'спортивный помощник': 1,
'инженер-программист станков чпу': 1,
'инженер по сопровождению': 1,
'unreal engine\u200b\u200b\u200b\u200b\u200b\u200b\u200b developer': 1,
'support engineer | специалист технической поддержки': 1,
'с++ developer': 1,
'graphics sw developer': 1,
'java developer - system programming': 1,
'usa - remote': 1,
'администратор hadoop': 1,
'support specialist calypso': 1,
'ml-разработчик': 1,
'scala': 1,
'разработчик по автоматизации тестирования в авторизацию': 1,
'b2b': 1,
'sqa engineer': 1,
'civil structural architectural engineer': 1,
'инженер-программист': 1,
'product manager investment platform': 1,
'cпециалист службы поддержки': 1,
'delivery': 1,
'product manager trading': 1,
'chief technical officer': 1,
'главный инженер': 1,
'с функциями coo': 1,
'product manager pitching': 1,
'seller operations': 1,
'key account manager': 1,
'operations': 1,
'principal architect': 1,
'crm manager': 1,
'direct marketing': 1,
'personalization': 1,
'practice expert - metals & mining': 1,
'simulation modeling': 1,
'инженер по технической поддержке систем биржевой торговли': 1,
'it support engineer': 1,
'удаленная работа': 1,
'marketplace health': 1,
'golang developer': 1,
'bi developer': 1,
'operations director': 1,
'modeling specialist': 1,
'ведущий разработчик dwh': 1,
'marketing bi analyst': 1,
'customer service support': 1,
'инженер по автотестированию': 1,
'in customer solutions': 1,
'modeling and simulation engineer': 1,
'monitoring operations engineer': 1,
'mon_ops': 1,
'потребительское кредитование': 1,
'regulatory affairs & trade compliance specialist': 1,
'technical product manager': 1,
'head of information & technology': 1,
'kotlin developer': 1,
'qodana': 1,
'static analysis project': 1,
'expeditor': 1,
'security analyst': 1,
'дежурный инженер баз данных postgresql': 1,
'monetization manager': 1,
'инженер сопровождения платежных решений': 1,
'дбо юридических лиц': 1,
'арм': 1,
'базы данных': 1,
'practice expert - mining': 1,
'developer product marketing engineer': 1,
'стажёр отдела аналитики': 1,
'practice expert - metallurgy': 1,
'инженер по организации управления производством': 1,
'supply production er': 1,
'инженер отдела научно-технической аналитики': 1,
'инженер системы мониторинга': 1,
'эксперт по сопровождению абс цфт': 1,
'менеджер продукта': 1,
'инженер по технической поддержке': 1,
'вентиляция и кондиционирование': 1,
'electrical design engineer': 1,
'инженер-электрик': 1,
'проектировщик': 1,
'head of digital marketing': 1,
'us market': 1,
'системный администратор': 1,
'node.js разработчик': 1,
'digital marketing director': 1}
В итоге мы имеем ситуацию, когда много вакансий содержит слово data scientist, также выделяются data engineer, data analyst. Часто встречаются qa engineer, big data, ml engineer. Они и будут самыми популярными.
dataset_ds_all['salary.currency'].value_counts()
RUR 1115 USD 53 EUR 6 Name: salary.currency, dtype: int64
# приводим зарплату к рублевому эквиваленту
for index in dataset_ds_all.index:
if dataset_ds_all.loc[index, 'salary.currency'] == 'USD' :
if(dataset_ds_all.loc[index, 'salary.from']):
dataset_ds_all.loc[index, 'salary.from'] *= 80
if dataset_ds_all.loc[index, 'salary.to']:
dataset_ds_all.loc[index, 'salary.to'] *= 80
elif dataset_ds_all.loc[index, 'salary.currency'] == 'EUR':
if(dataset_ds_all.loc[index, 'salary.from']):
dataset_ds_all.loc[index, 'salary.from'] *= 90
if dataset_ds_all.loc[index, 'salary.to']:
dataset_ds_all.loc[index, 'salary.to'] *= 90
dataset_ds_all.loc[index, 'salary.currency'] = 'RUR'
# для нижней вилки
dataset_ds_all['salary.from'].agg(['count', 'mean', 'median', 'min', 'max'])
count 190.000000 mean 212880.421053 median 200000.000000 min 10000.000000 max 800000.000000 Name: salary.from, dtype: float64
# для верхней
dataset_ds_all['salary.to'].agg(['count', 'mean', 'median', 'max', 'min'])
count 120.000000 mean 285946.333333 median 250000.000000 max 640000.000000 min 45000.000000 Name: salary.to, dtype: float64
# обработаем навыки
list_of_skills_ds = []
def skill_parser(skills):
for l in skills:
list_of_skills_ds.append(l.lower())
for skills in dataset_ds_all['skills']:
if skills:
skill_parser(skills)
dict(sorted(Counter(list_of_skills_ds).items(), key=lambda item: -item[1]))
{'python': 406,
'sql': 388,
'linux': 174,
'английский язык': 150,
'java': 125,
'git': 106,
'data mining': 85,
'postgresql': 84,
'ms sql': 77,
'hadoop': 75,
'c++': 67,
'spark': 65,
'etl': 54,
'анализ данных': 52,
'big data': 49,
'data analysis': 48,
'scala': 46,
'docker': 46,
'atlassian jira': 45,
'математическая статистика': 44,
'project management': 41,
'ms powerpoint': 40,
'базы данных': 36,
'oracle': 35,
'javascript': 34,
'machine learning': 32,
'aws': 31,
'agile project management': 31,
'kafka': 30,
'ms sql server': 30,
'spring framework': 29,
'работа в команде': 28,
'kubernetes': 28,
'analytical skills': 27,
'bash': 27,
'product management': 27,
'статистический анализ': 26,
'data science': 26,
'mysql': 24,
'управление проектами': 24,
'аналитическое мышление': 23,
'mongodb': 23,
'аналитические исследования': 22,
'математическое моделирование': 21,
'ms excel': 20,
'dwh': 20,
'c#': 20,
'ml': 19,
'clickhouse': 19,
'scrum': 19,
'rest': 18,
'работа с базами данных': 18,
'обучение и развитие': 18,
'marketing analysis': 18,
'информационные технологии': 18,
'тестирование': 17,
'oracle pl/sql': 17,
'ms access': 17,
'hive': 17,
'presentation skills': 17,
'airflow': 16,
'team management': 16,
'c/c++': 16,
'pytorch': 15,
'business english': 15,
'google analytics': 15,
'функциональное тестирование': 15,
'api': 15,
'бизнес-анализ': 14,
'pandas': 14,
'html': 14,
'грамотная речь': 14,
'business development': 14,
'react': 14,
'node.js': 14,
'tensorflow': 13,
'django framework': 13,
'cистемы управления базами данных': 13,
'atlassian confluence': 13,
'zabbix': 13,
'matlab': 12,
'машинное обучение': 12,
'nlp': 12,
'tableau': 12,
'xml': 12,
'unix': 12,
'ооп': 12,
'nosql': 12,
'software development': 12,
'ios': 12,
'r': 11,
'teamleading': 11,
'база данных: oracle': 11,
'leadership skills': 11,
'прогнозирование': 11,
'crm': 11,
'rabbitmq': 11,
'css': 11,
'time management': 11,
'hibernate orm': 11,
'информационная безопасность': 11,
'ci/cd': 11,
'математический анализ': 10,
'vertica': 10,
'ориентация на результат': 10,
'grafana': 10,
'databases': 10,
'redis': 10,
'junit': 10,
'centos': 10,
'qa': 10,
'data engineering': 10,
'typescript': 10,
'ms visio': 9,
'разработка по': 9,
'golang': 9,
'ms project': 9,
'negotiation skills': 9,
'sales management': 9,
'devops': 9,
'android': 9,
'market research': 9,
'test case': 9,
'apache maven': 9,
'tcp/ip': 9,
'системная интеграция': 9,
'computer vision': 8,
'numpy': 8,
'design patterns': 8,
'soap': 8,
'php': 8,
'ruby': 8,
'cisco': 8,
'ms outlook': 8,
'business analysis': 8,
'data scientist': 7,
'data engineer': 7,
'деловая коммуникация': 7,
'flask': 7,
'субд': 7,
'управление командой': 7,
'openshift': 7,
'jquery': 7,
'customer relationship management': 7,
'teamplayer': 7,
'angularjs': 7,
'customer service': 7,
'vmware': 7,
'marketing communication': 7,
'deep learning': 6,
'проведение презентаций': 6,
'keras': 6,
'sas': 6,
'аналитика': 6,
'маркетинговый анализ': 6,
'nginx': 6,
'b2b marketing': 6,
'управление продуктом': 6,
'kotlin': 6,
'разработка технических заданий': 6,
'ux': 6,
'jira': 6,
'shell scripting': 6,
'social media marketing': 6,
'prometheus': 6,
'autocad': 6,
'статистика': 5,
'навыки презентации': 5,
'.net framework': 5,
'системное мышление': 5,
'оптимизация бизнес-процессов': 5,
'iot': 5,
'azure': 5,
'active directory': 5,
'системный анализ': 5,
'ms office': 5,
'ansible': 5,
'olap (online analytical processing)': 5,
'администрирование': 5,
'cassandra': 5,
'networking': 5,
'go': 5,
'тестирование пользовательского интерфейса': 5,
'json': 5,
'gitlab': 5,
'launching new products': 5,
'swift': 5,
'business planning': 5,
'абс': 5,
'креативность': 5,
'финансовая отчетность': 5,
'startup': 5,
'подготовка презентаций': 4,
'торговая площадка': 4,
'работа с большим объемом информации': 4,
'elasticsearch': 4,
'риск-менеджмент': 4,
'грамотность': 4,
'подбор персонала': 4,
'elk': 4,
'публичные выступления': 4,
'informatica': 4,
'hdfs': 4,
'nifi': 4,
'ui': 4,
'english': 4,
'greenplum': 4,
'a/b тесты': 4,
'mac os': 4,
'автоматизация': 4,
'java ee': 4,
'unit testing': 4,
'postman': 4,
'java se': 4,
'sales skills': 4,
'budgeting': 4,
'strategic marketing': 4,
'администрирование серверов linux': 4,
'risk management': 4,
'jenkins': 4,
'e-commerce': 4,
'sap project': 4,
'allfusion erwin data modeler': 4,
'автоматизированные банковские системы': 4,
'erp': 4,
'venture capital': 4,
'xgboost': 3,
'vue.js': 3,
'computer science': 3,
'поиск информации в интернет': 3,
'transact-sql': 3,
'математическое программирование': 3,
'green data': 3,
'написание научный статей': 3,
'google adwords': 3,
'аналитический склад ума': 3,
'matplotlib': 3,
'разработка поисковых технологий': 3,
'управление рисками': 3,
'artificial intelligence': 3,
'scipy': 3,
'jupyter': 3,
'ms visual studio': 3,
'adobe after effect': 3,
'business intelligence systems': 3,
'terraform': 3,
'рекрутмент': 3,
'организаторские навыки': 3,
'маркетинговые исследования': 3,
'разработка нового продукта': 3,
'power bi': 3,
'tfs': 3,
'uml': 3,
'аналитические способности': 3,
'cad': 3,
'финансовый анализ': 3,
'powerbi': 3,
'software architecture': 3,
'oracle 11g': 3,
'регресионное тестирование': 3,
'json api': 3,
'angular': 3,
'recruitment': 3,
'powershell': 3,
'e-mail marketing': 3,
'управление продажами': 3,
'b2b продажи': 3,
'активные продажи': 3,
'http': 3,
'seo': 3,
'public speaking': 3,
'sap': 3,
'it рекрутмент': 3,
'карьерное консультирование': 3,
'поддержка клиентов': 3,
'разработка концепции': 3,
'analysis': 3,
'windows': 3,
'asp.net': 3,
'development': 3,
'администрирование серверов windows': 3,
'mining': 3,
'oracle sql': 3,
'сзп': 3,
'зарплатные проекты': 3,
'управление временем': 3,
'bpmn': 3,
'техническая поддержка': 3,
'kibana': 3,
'customer needs analysis': 3,
'trading': 3,
'запуск новых продуктов': 3,
'аналитика продаж': 3,
'investment banking': 3,
'взаимодействие с инвестиционными фондами': 3,
'биржевые торги': 3,
'вывод продукта на рынок': 3,
'broker': 3,
'user growth': 3,
'growth hacking': 3,
'mathematical statistics': 2,
'mathematical modeling': 2,
'нейронные сети': 2,
'прикладная математика': 2,
'анализ временных рядов': 2,
'язык r': 2,
'pyhton': 2,
'reinforcement learning': 2,
'python 3': 2,
'data analyst': 2,
'kinesis': 2,
'написание статей': 2,
'product promotion': 2,
'деловая переписка': 2,
'анализ рисков': 2,
'mathcad': 2,
'pyspark': 2,
'it': 2,
'natural language processing': 2,
'навыки межличностного общения': 2,
'ansi sql': 2,
'scikit_learn': 2,
'spark mllib': 2,
'zeppelin': 2,
'seaborn': 2,
'dask': 2,
'hpc': 2,
'mlflow': 2,
'high-performance computing': 2,
'system design': 2,
'algorithm optimization': 2,
'sql on hadoop': 2,
'jupiter': 2,
'системный подход': 2,
'hypersonic sql': 2,
'memcached': 2,
'написание процедур': 2,
'стратегия развития': 2,
'adobe dreamweaver': 2,
'data lake': 2,
'руководство командой разработчиков': 2,
'microsoft visual studio': 2,
'эконометрика': 2,
'google bigquery': 2,
'поиск и привлечение клиентов': 2,
'экономический анализ': 2,
'hbase': 2,
'saas': 2,
'ssis': 2,
'веб-аналитика': 2,
'сбор и анализ информации': 2,
'vba': 2,
'business intelligence': 2,
'algorithms': 2,
'elt': 2,
'пользователь пк': 2,
'selenium': 2,
'confluence': 2,
'pascal': 2,
'тестирование мобильных приложений': 2,
'selenium ide': 2,
'teradata': 2,
'stl': 2,
'apache nifi': 2,
'qlikview': 2,
'activemq': 2,
'aws sqs': 2,
'unix shell scripts': 2,
'jdbc': 2,
'работа с документами': 2,
'bi': 2,
'system analysis': 2,
'talend': 2,
'teambuilding': 2,
'podman': 2,
'xpath': 2,
'apache tomcat': 2,
'selenoid': 2,
'jmeter': 2,
'algorithms and data structures': 2,
'визуализация данных': 2,
'data structures and algorithms': 2,
'data studio': 2,
'firebase': 2,
'perl': 2,
'salesforce': 2,
'programming for mac': 2,
'programming for windows': 2,
'linux platform': 2,
'ruby on rails': 2,
'gtm': 2,
'jpa': 2,
'testrail': 2,
'it recruitment': 2,
'redux': 2,
'product development': 2,
'.net core': 2,
'angular 9': 2,
'rxjs': 2,
'vpn': 2,
'разработка продукта': 2,
'нефтегаз': 2,
'ведение переговоров': 2,
'регресcионное тестирование': 2,
'windows 7': 2,
'windows os': 2,
'ритейл': 2,
'key account management': 2,
'appsflyer': 2,
'debian': 2,
'customer support': 2,
'kvm': 2,
'ci/сd': 2,
'saltstack': 2,
'digital marketing': 2,
'настройка сетевых подключений': 2,
'настройка пк': 2,
'web application development': 2,
'openstack': 2,
'html5': 2,
'lua': 2,
'data structure': 2,
'entity framework': 2,
'стратегический анализ': 2,
'тайм-менеджмент': 2,
'user acceptance testing': 2,
'itsm': 2,
'oracle siebel crm': 2,
'impala': 2,
'brand management': 2,
'редактирование': 2,
'написание текстов': 2,
'редакторская деятельность': 2,
'ospf': 2,
'bgp': 2,
'spectrum': 2,
'мобильность': 2,
'internet marketing': 2,
'webpack': 2,
'spring boot': 2,
'organization skills': 2,
'прокладка кабелей': 2,
'планирование продаж': 2,
'развитие ключевых клиентов': 2,
'c-level': 2,
'itil': 2,
'nutanix': 2,
'business process management': 2,
'strategic management': 2,
'treasury and liquidity management': 2,
'coo': 2,
'process automation': 2,
'деловое общение': 2,
'управление отношениями с клиентами': 2,
'technical support': 2,
'многозадачность': 2,
'ccnp': 2,
'adobe photoshop': 2,
'unreal engine': 2,
'autodesk 3ds max': 2,
'crowdfunding': 2,
'fundraising': 2,
'product marketing': 2,
'pre-sales': 2,
'customer orientation': 2,
'architecture': 2,
'metallurgy': 2,
'problem solving skills': 2,
'ml-фреймворков (tensorflow, pytorch, numpy);': 1,
'гарант плюс': 1,
'бизнес-консультирование': 1,
'компьютерное зрение': 1,
'программирование': 1,
'mathematical programming': 1,
'количественные исследования': 1,
'scikit-learn': 1,
'graphql': 1,
'торговля': 1,
'dl фреймворки': 1,
'npu': 1,
'edge': 1,
'искусственный интеллект ai': 1,
'экономическое моделирование': 1,
'nlu': 1,
'neural networks': 1,
'валидация моделей': 1,
'моделирование бизнес процессов': 1,
'аналитик данных': 1,
'дата аналитик': 1,
'продуктовый аналитик': 1,
'product analyst': 1,
'aws glue': 1,
'aws cdk': 1,
'aws redshift': 1,
'datadog': 1,
'eventbridge': 1,
'ориентация на клиента': 1,
'научные исследования': 1,
'написание научных статей': 1,
'научная деятельность': 1,
'cv': 1,
'classical machine learning': 1,
'ml engineer': 1,
'map-reduce': 1,
'розничные риски': 1,
'фондовый рынок сша': 1,
'spark streaming': 1,
'opencv': 1,
'r/python': 1,
'методы машинного обучения': 1,
'разработка рекомендательных систем': 1,
'my sql': 1,
'nltk': 1,
'pymorphy': 1,
'построение моделей': 1,
'django': 1,
'catboost': 1,
'анализ бизнес показателей': 1,
'финансовое моделирование': 1,
'recsys': 1,
'ai': 1,
'multiphase': 1,
'presales': 1,
'customer': 1,
'sagemaker': 1,
'обучение персонала': 1,
'roberta': 1,
'petrel': 1,
'techlog': 1,
'coreldraw': 1,
'scikit': 1,
'plotly': 1,
'statsmodels': 1,
'apache': 1,
'lightgbm': 1,
'annoy': 1,
'gpgpu': 1,
'latex': 1,
'dataiku': 1,
'электронный документооборот': 1,
'swarm': 1,
'automl': 1,
'looker': 1,
'бизнес-моделирование': 1,
'sklearn': 1,
'nlp модели': 1,
'spss modeler': 1,
'творческое мышление': 1,
'прямой поиск': 1,
'постановка задач разработчикам': 1,
'оценка потребностей клиентов': 1,
'agile': 1,
'lead data': 1,
'кадровый менеджмент': 1,
'управление hr-процессами': 1,
'управление бизнес процессами': 1,
'microsoft access': 1,
'flite': 1,
'coreml': 1,
'коммерция': 1,
'opera': 1,
'di': 1,
'room': 1,
'gradle': 1,
'rx': 1,
'управление маркетингом': 1,
'анализ рынка': 1,
'оценка рисков': 1,
'snowflake': 1,
'start-up project': 1,
'google data studio': 1,
'cоциальный маркетинг': 1,
'адаптация': 1,
'lucene': 1,
'solr': 1,
'google cloud': 1,
'delphi': 1,
'information systems architecture': 1,
'build complex system-level features': 1,
'back-end development experience': 1,
'application architecture': 1,
'experience in designing': 1,
'build engineer': 1,
'azure pipelines': 1,
'msbuild': 1,
'ms internet explorer': 1,
'обработка видео': 1,
'arenadata hadoop': 1,
'informatica data engineering': 1,
'postgres': 1,
'groovy': 1,
'flink': 1,
'проектная документация': 1,
'probability theory and mathematical statistics': 1,
'statistical analysis': 1,
'data analytics': 1,
'scripting languages': 1,
'game dev': 1,
'ozzie': 1,
'simd': 1,
'concurrent programming': 1,
'vectorized cpu execution': 1,
'postrgresql': 1,
'microsof power bi': 1,
'mathematical computing': 1,
'big data algorithms': 1,
'machine learning algorithm': 1,
'web-тестирование': 1,
'highload': 1,
'3d': 1,
'calibration': 1,
'support engineer': 1,
'line 3': 1,
'physics': 1,
'electronics': 1,
'eda': 1,
'radiophysics': 1,
'spice': 1,
'numerical methods': 1,
'rdbms': 1,
'kaldi': 1,
'mapreduce': 1,
'сопровождение клиентов': 1,
'browser dev tools': 1,
'http/https': 1,
'elasticsearth': 1,
'apach spark': 1,
'apache spark': 1,
'аналитика больших данных': 1,
'mobile testing': 1,
'etl testing': 1,
'appium': 1,
'высокие аналитические способности': 1,
'методы анализа данных': 1,
'запросы sql': 1,
'ai-моделирование': 1,
'finagle': 1,
'datalake': 1,
'графовые бд': 1,
'веб-программирование': 1,
'enterprise data warehouse': 1,
'оптимизация логистических процессов': 1,
'консультирование': 1,
'graph db': 1,
'neo4j': 1,
'sparql': 1,
'gremlin': 1,
'tinkerpop': 1,
'pregel': 1,
'cypher': 1,
'aws neptune': 1,
'okta': 1,
'aws cognito': 1,
'dynamodb': 1,
'emr': 1,
'bert': 1,
'ops': 1,
'python3': 1,
'pentaho data integration': 1,
'powerpivot': 1,
'powerquery': 1,
'dax': 1,
'parsing': 1,
'парсинг': 1,
'parser': 1,
'анализ баз данных': 1,
'data quality': 1,
'pycharm': 1,
'zookeeper': 1,
'с#': 1,
'ml flow': 1,
'cloveretl': 1,
'pentaho': 1,
'трансфертное ценообразование': 1,
'putty': 1,
'winscp': 1,
'cognos': 1,
'apache hive': 1,
'powermap': 1,
'power pivot': 1,
'query': 1,
'ssrs': 1,
'mdx': 1,
'cloud computing': 1,
'pytest': 1,
'разработка тестовой документации': 1,
'data warehousing': 1,
'intellij idea': 1,
'redis, mongodb': 1,
'testlink': 1,
'selenide': 1,
'testng': 1,
'allurereport': 1,
'rest-assured': 1,
'autotests': 1,
'rust': 1,
'развитие хранилища данных': 1,
'развитие bi-платформ': 1,
'матстат': 1,
'tibco': 1,
'containerization': 1,
'numerical simulators': 1,
'gdpr': 1,
'qlik': 1,
'qlicksense': 1,
'cte': 1,
'яндекс.метрика': 1,
'oracle bi': 1,
'appmetrica': 1,
'bigquery': 1,
'web аналитика': 1,
'продуктовая аналитика': 1,
'shell': 1,
'apache/tomcat': 1,
'celery': 1,
'cоциальная реклама': 1,
'визуализация': 1,
'урегулирование убытков': 1,
'dotnet core': 1,
'visualforce': 1,
'apex': 1,
'soql': 1,
'laravel': 1,
'microsoft office tools, 1c': 1,
'сooperative mind': 1,
'enthusiasm to achieve goals': 1,
'ability to work as a team with respect to colleagues and business partners': 1,
'communication skills with manners': 1,
'flexibility in new environment': 1,
'no hesitation to try something new and proactivity': 1,
'rest api': 1,
'sdlc': 1,
'chrome devtools': 1,
'quik': 1,
'ios human interface guidelines': 1,
'uikit': 1,
'autolayout': 1,
'coredata': 1,
'figma': 1,
'principle': 1,
'keynote': 1,
'ffmpeg': 1,
'video': 1,
'управленческая отчетность': 1,
'wifi networks': 1,
'педагогический дизайн': 1,
'методология': 1,
'разработка курсов': 1,
'андрагогика': 1,
'техническая эксплуатация': 1,
'логистика поставок': 1,
'фрахт': 1,
'mobile games': 1,
'cms wordpress': 1,
'дистанционное обучение': 1,
'1c: бухгалтерия': 1,
'gaap': 1,
'tax accounting': 1,
'taxation': 1,
'ajax': 1,
'интеграционное тестирование': 1,
'развитие продаж': 1,
'5g': 1,
'эра-glonass': 1,
'keysight': 1,
'телеком': 1,
'измерительное оборудование': 1,
'беспроводная связь': 1,
'4g': 1,
'векторный генератор': 1,
'антенны': 1,
'радиосвязь': 1,
'цифровая экономика': 1,
'анализаторы цепей': 1,
'генераторы': 1,
'холодные продажи': 1,
'прямые продажи': 1,
'радиоканал': 1,
'lean production': 1,
'xamarin': 1,
'oauth': 1,
'realm': 1,
'aws amplify': 1,
'mobile development': 1,
'asyncio': 1,
'cypress': 1,
'protractor': 1,
'puppeteer': 1,
'page object': 1,
'restfull': 1,
'manual and automated testing': 1,
'sast': 1,
'owasp': 1,
'wireshark': 1,
'ssl pinning': 1,
'security': 1,
'wildfly': 1,
'maven': 1,
'b2c маркетинг': 1,
'русский язык': 1,
'разработка платформы': 1,
'smm': 1,
'power supply': 1,
'power plant design': 1,
'people management': 1,
'mq': 1,
'гибкие методологии': 1,
'spring': 1,
'организация технического обслуживания автомобилей': 1,
'материально-техническое обеспечение': 1,
'cmms': 1,
'dwh, data lake,': 1,
'elт, etl': 1,
'magento': 1,
'chef': 1,
'amplitude': 1,
'google tag manager': 1,
'postgre db': 1,
'informatica power center': 1,
'remote': 1,
'full-time': 1,
'macos': 1,
'cpp': 1,
'ведение комплексных ит-проектов': 1,
'x86': 1,
'arm': 1,
'assembly': 1,
'assembler': 1,
'aarch64': 1,
'memory management': 1,
'qemu': 1,
'open source': 1,
'data warehouse': 1,
'инвестиции': 1,
'корпоративные финансы': 1,
'оценка инвестиционных проектов': 1,
'фондовый рынок': 1,
'ms visual c++': 1,
'умение работать в коллективе': 1,
'sap mm': 1,
'sap bi': 1,
'sap bw': 1,
'freebsd': 1,
'us gaap': 1,
'research and development': 1,
'r&d': 1,
'graph theory': 1,
'queuing theory': 1,
'scheduling': 1,
'stochastic analysis': 1,
'probability theory': 1,
'теория графов': 1,
'теория массового обслуживани': 1,
'стохастиечский анализ': 1,
'network calculus': 1,
'руководство коллективом': 1,
'aris': 1,
'frontend': 1,
'spring root': 1,
'spring security': 1,
'spring data': 1,
'oop': 1,
'qt': 1,
'algorithm': 1,
'ood/oop': 1,
'cam': 1,
'mfc': 1,
'vb scripting': 1,
'prd': 1,
'fsp': 1,
'prism': 1,
'расчет затрат': 1,
'cost analysis': 1,
'construction': 1,
'microservices architecture': 1,
'стратегическое мышление': 1,
'развитие бренда': 1,
'лидерство': 1,
'googlecloud': 1,
'mssql sql 2005-2017': 1,
'citrix': 1,
'нагрузочное тестирование': 1,
'load runner': 1,
'load testing': 1,
'teamcity': 1,
'helm': 1,
'adjust': 1,
'yandex metrica': 1,
'цфт-банк': 1,
'bat': 1,
'vbscript': 1,
'pl+': 1,
'работа с пользователями': 1,
'android sdk': 1,
'spark sql': 1,
'kafka,': 1,
'hue': 1,
'etl / self service etl': 1,
'apache http server': 1,
'операционная система linux/gnu': 1,
'couchbase': 1,
'haproxy': 1,
'adtech': 1,
'ror': 1,
'удаленная работа': 1,
'ccna routing and switching': 1,
'eigrp': 1,
'.net': 1,
'asp.net core': 1,
'reactjs': 1,
'math': 1,
'compass 3d': 1,
'dwdm': 1,
'ip/mpls': 1,
'проведение тестирований': 1,
'инженерные системы': 1,
'cmdb': 1,
'коммуникативные навыки': 1,
'dam': 1,
'мобильное тестирование': 1,
'тестирование web': 1,
'lambda': 1,
'erp systems': 1,
'microsoft dynamics ax': 1,
'internet': 1,
'helpdesk': 1,
'van/lan': 1,
'ms project expert': 1,
'pl/sql': 1,
'бисквит': 1,
'open shift': 1,
'spa': 1,
'alamofire': 1,
'unit-тесты': 1,
'swiftymock': 1,
'contract management': 1,
'objective-c': 1,
'поддержка работы офиса': 1,
'engineering': 1,
'pump engineering': 1,
'добыча сырья': 1,
'strategic planning': 1,
'consultancy': 1,
'проектирование лвс': 1,
'фоив': 1,
'системы мониторинга': 1,
'облачная платформа': 1,
'huawei': 1,
'инновационный менеджмент': 1,
'сэд': 1,
'oracle db': 1,
'монтаж оборудования': 1,
'цод': 1,
'серверное оборудование': 1,
'web': 1,
'автоматизация бизнес-процессов': 1,
'создание ис': 1,
'ит-активы': 1,
'управление ит-мощностями': 1,
'microfocus servicemanager': 1,
'power bi report server': 1,
'подготовка коммерческих предложений': 1,
'finereader': 1,
'black box testing': 1,
'e-staff': 1,
'управление персоналом': 1,
'аналитик': 1,
'кредитные договоры': 1,
'microsoft 365': 1,
'office 365': 1,
'windows10': 1,
'mathematical analysis': 1,
'object oriented programming': 1,
'gdb': 1,
'cvs': 1,
'проектный менеджмент': 1,
'consul': 1,
'eureka': 1,
'zuul': 1,
'amqp': 1,
'websockets': 1,
'навыки переговоров': 1,
'организация мероприятий': 1,
'организация деловых поездок': 1,
'организация презентаций': 1,
'business communication': 1,
'ember': 1,
'agail': 1,
'внутренний контроль': 1,
'access': 1,
'cpaas': 1,
'telecommunications': 1,
'presale': 1,
'инженер по продажам': 1,
'p2p': 1,
'строительство': 1,
'backend': 1,
'ccna': 1,
'mtwo': 1,
'cuda': 1,
...}
Гораздо легче, чем с названиями вакансий, где английский и русский языки перемешиваются. В большинстве вакансий требуется знание python, требуется владение sql. Далее linux, владение английским, математическими дисциплинами, data mining, git, java, postgresql, docker и тд.
# опыт
dataset_ds_all.groupby('experience.name')['id'].count().sort_values(ascending=False)
experience.name От 3 до 6 лет 517 От 1 года до 3 лет 462 Нет опыта 101 Более 6 лет 94 Name: id, dtype: int64
Чаще всего требуется опыт работы от 1 до 3 лет и от 3 до 6 лет.
dataset_ds_all.groupby('employer.name')['id'].count().sort_values(ascending=False)
employer.name
Сбербанк 102
Т1 Интеграция 30
Exness 18
Билайн 16
МТС Банк 15
...
Альфа-Банк 1
АльфаСтрахование 1
Аренадата Софтвер 1
Артистраж 1
Verenia 1
Name: id, Length: 477, dtype: int64
Видно, что Сбербанк в топе, почти десятая часть вакансий его. У следующей компании Т1 Интеграция ваканстй в 3 раза меньше.
dataset_ds_all.groupby('employer.name')['salary.to'].mean().sort_values(ascending=False).head(10)
employer.name Behavox 640000.0 IT_Selection 640000.0 Coins.ph 560000.0 Hunt For You 500000.0 Chatfuel 480000.0 Студия HR Решений 480000.0 ОнТаргет ЛАБС 480000.0 LATOKEN 442500.0 TeamDirector 420000.0 Software Consulting Solutions 400000.0 Name: salary.to, dtype: float64
dataset_ds_all.groupby('employer.name')['salary.from'].mean().sort_values(ascending=False).head(10)
employer.name Cube.js 600000.000000 Fivetran 520000.000000 Behavox 482000.000000 IT_Selection 480000.000000 Hunt For You 366666.666667 Top Remote Talent 360000.000000 ecomsolutions 360000.000000 Coins.ph 360000.000000 Wisebits 360000.000000 DemandMatrix 320000.000000 Name: salary.from, dtype: float64
Кажется, сравнивать работодателей по максимальной зарплате трудно, так как очень многие просто ее не указывают, а те, которые указывают, обычно имеют по 1 вакансии, что недостаточно для понимания среднего. Однако в топе Behavox, IT_Selection, Coins.ph, Hunt For You.
metro_num_ds = dataset_ds_all.groupby('address.metro.station_name')['id'].count().sort_values(ascending=False)
metro_num_ds
address.metro.station_name
Новокузнецкая 27
Технопарк 20
Тульская 19
Кутузовская 17
Маяковская 17
..
Кузнецкий мост 1
Кунцевская 1
Московские ворота 1
Молодежная 1
Жулебино 1
Name: id, Length: 92, dtype: int64
# подгрузим табличку соответствия метро и района города
dataset_metro = pd.read_csv('metro.csv')
dataset_metro = dataset_metro[['Station', 'District']]
dataset_metro
| Station | District | |
|---|---|---|
| 0 | Третьяковская | район Замоскворечье |
| 1 | Медведково | район Северное Медведково |
| 2 | Первомайская | район Измайлово |
| 3 | Калужская | Обручевский район |
| 4 | Каховская | район Зюзино |
| ... | ... | ... |
| 302 | Стромынка | район Сокольники |
| 303 | Лефортово | район Лефортово |
| 304 | Зюзино | район Зюзино |
| 305 | Народное Ополчение | район Хорошёво-Мнёвники |
| 306 | Мнёвники | район Хорошёво-Мнёвники |
307 rows × 2 columns
dataset_stations_ds = dataset_ds_all[['id', 'address.metro.station_name', 'salary.from', 'salary.to']]
dataset_stations_ds = pd.merge(dataset_stations_ds, dataset_metro, left_on='address.metro.station_name', right_on = 'Station', how='inner')
dataset_stations_ds = dataset_stations_ds.drop_duplicates()
# dataset_stations_ds.duplicated().sum()
dataset_stations_ds.groupby('District')['id'].count().sort_values(ascending=False)
District район Замоскворечье 49 Тверской район 45 Пресненский район 29 Даниловский район 25 район Дорогомилово 24 район Нагатино-Садовники 22 район Аэропорт 18 Басманный район 17 район Хамовники 15 Мещанский район 12 Донской район 11 Савёловский район 11 Красносельский район 8 Нагорный район 7 район Арбат 7 Головинский район 7 Академический район 7 район Сокол 6 район Свиблово 6 Таганский район 6 район Текстильщики 5 Войковский район 5 район Покровское-Стрешнево 5 поселение Московский 4 Алексеевский район 4 район Крылатское 4 район Преображенское 3 район Раменки 3 Бутырский район 3 Хорошёвский район 3 район Тропарёво-Никулино 3 район Соколиная Гора 2 район Новогиреево 2 район Строгино 2 район Москворечье-Сабурово 2 Обручевский район 2 район Хорошёво-Мнёвники 1 Нижегородский район 1 Южнопортовый район 1 район Зюзино 1 район Кунцево 1 район Левобережный 1 район Отрадное 1 район Фили-Давыдково 1 район Выхино-Жулебино 1 Name: id, dtype: int64
Видим, что большая часть вакансий находится в Тверском, Замоскворечье и Пресненском, Далиловском районах. В районах Зюзино, Кунцево, Левобережный, Отрадное районах по 1 вакансии.
fig = px.histogram(x=dataset_ds_all["salary.from"].dropna(), nbins = 20)
fig.update_layout(
title='Гистограмма нижней границы зарплаты',
xaxis={'title':'Зарплата'},
yaxis={'title':'Количество вакансий'})
fig.show()
fig = px.histogram(x=dataset_ds_all["salary.to"].dropna(), nbins = 20)
fig.update_layout(
title='Гистограмма верхней границы зарплаты',
xaxis={'title':'Зарплата'},
yaxis={'title':'Количество вакансий'})
fig.show()
На гистограммах хорошо видно, что есть какое-то среднее значение, а по бокам распределение спадает. Есть несколько выбросов с большими зарплатами.
# 25 самых популярных навыков
sorted_skills_ds = dict(sorted(Counter(list_of_skills_ds).items(), key=lambda item: -item[1]))
best_skills_ds = list(sorted_skills_ds.keys())[:25]
best_skills_ds
['python', 'sql', 'linux', 'английский язык', 'java', 'git', 'data mining', 'postgresql', 'ms sql', 'hadoop', 'c++', 'spark', 'etl', 'анализ данных', 'big data', 'data analysis', 'scala', 'docker', 'atlassian jira', 'математическая статистика', 'project management', 'ms powerpoint', 'базы данных', 'oracle', 'javascript']
# самый популярные группы
sorted_groups_ds = dict(sorted(Counter(list_of_names_ds).items(), key=lambda item: -item[1]))
best_groups_ds = list(sorted_groups_ds.keys())[:15]
best_groups_ds
['data scientist', 'data engineer', 'remote', 'qa engineer', 'data analyst', 'python', 'big data', 'devops инженер', 'qa automation engineer', 'ml engineer', 'devops engineer', 'аналитик данных', 'java developer', 'python developer', 'product manager']
# подсчет того, насколько часто требуется конкретный навык в конкретной группе
table_groups_skills_ds = np.zeros((len(best_groups_ds), len(best_skills_ds)))
def is_group_skill(row):
if row['skills']:
string = "".join(row['skills'])
# print(string)
for i, group in enumerate(best_groups_ds):
if row['name'].lower().find(group) != -1:
for j, skill in enumerate(best_skills_ds):
if string.lower().find(skill) != -1:
table_groups_skills_ds[i][j] += 1
for index in dataset_ds_all.index:
is_group_skill(dataset_ds_all.loc[index])
# построение heatmap по табличке
figure = go.Figure(
data=go.Heatmap(
x=best_skills_ds,
y=best_groups_ds,
z=table_groups_skills_ds,
zmin=0,
zmax=20,
colorscale='Viridis')
)
figure.update_layout(
title='Heatmap с количеством вакансий (от группы и навыка)',
xaxis={'title':'Навык'},
yaxis={'title':'Вакансия'})
figure.show()
Проблема в том, что очень много вакансий содержит слово data scientist, однако все равно видны некоторые закономерности, у devops ценится работа на linux, навыки работы с git linux у python developer, аналитику нужны математические дисциплины. У data engineer нужен oracle, базы данных, product manager должен знать анлийский. QA automation engineer должен владеть java и тд, легче посмотреть самостоятельно.
Ух ты, тут компании из Питера и Минска, нужно их дропнуть.
dataset_ds_all = dataset_ds_all[dataset_ds_all['address.metro.lng'] > 32]
fig = px.scatter_mapbox(
dataset_ds_all,
lat='address.metro.lat',
lon='address.metro.lng',
hover_name = 'name',
zoom=10,
title='Координаты вакансий')
fig.update_layout(mapbox_style = "open-street-map")
fig.show()
Все вакансии попадают КАД, так и должно быть. На первый взгляд распределены достаточно равномерно, посмотрим чуть позже на график плотности на карте.
dataset_ds_all['salary.average'] = np.nan
# приводим среднюю зарплату
for index in dataset_ds_all.index:
salary_from = dataset_ds_all.loc[index, 'salary.from']
salary_to = dataset_ds_all.loc[index, 'salary.to']
if salary_from is not None:
dataset_ds_all.loc[index, 'salary.average'] = salary_from
if salary_to is not None:
dataset_ds_all.loc[index, 'salary.average'] = salary_to
if (salary_from is not None) & (salary_to is not None):
dataset_ds_all.loc[index, 'salary.average'] = (salary_from + salary_to) / 2
# посмотрим на зарплату на карте
pio.renderers.default='notebook'
plotly.offline.init_notebook_mode(connected =True)
px.set_mapbox_access_token(open('token.txt').read())
fig = px.density_mapbox(dataset_ds_all,
lat = 'address.metro.lat',
lon = 'address.metro.lng',
z = 'salary.average',
title='Плотность зарплаты',
zoom=10)
fig.show('notebook')
Вот тут уже интереснее, пятна в центре гораздо горяее, значит вакансии, которые ближе к центру, в среднем предлагают выше зарплату, достаточно закономерно, они крупнее и имеют деньги на аренду офисов в центре для удобства сотрудников и платят, соответственно, больше.
# dataset_metro_lat_lng = pd.read_csv('metro_lat_lng.csv')
# я запарился и загрузил широту и долготу с сайте, который вы посоветовали, но там не оказалось около 10 станций!!
dupl = [67, 105, 117, 181, 225, 277, 302]
dataset_metro = dataset_metro[['Station', 'District']]
dataset_metro_num_ds = metro_num_ds.to_frame()
dataset_metro_num_ds = dataset_metro_num_ds.rename(columns={"id": "num"})
dataset_metro_num_ds = dataset_metro_num_ds.reset_index('address.metro.station_name')
dataset_metro_num_ds = pd.merge(dataset_metro_num_ds, dataset_ds_all, left_on='address.metro.station_name',
right_on = 'address.metro.station_name',
how='left')
dataset_metro_num_ds = dataset_metro_num_ds[['address.metro.lat', 'address.metro.lng', 'address.metro.station_name', 'num']]
dataset_metro_num_ds = dataset_metro_num_ds.drop_duplicates()
# dataset_metro_num_ds[dataset_metro_num_ds['address.metro.station_name'].duplicated()]
dataset_metro_num_ds = dataset_metro_num_ds.drop(dupl, axis=0)
dataset_metro_num_ds
| address.metro.lat | address.metro.lng | address.metro.station_name | num | |
|---|---|---|---|---|
| 0 | 55.742391 | 37.629280 | Новокузнецкая | 27 |
| 27 | 55.695000 | 37.664167 | Технопарк | 20 |
| 47 | 55.709610 | 37.622569 | Тульская | 19 |
| 66 | 55.740544 | 37.534100 | Кутузовская | 17 |
| 83 | 55.769808 | 37.596192 | Маяковская | 17 |
| ... | ... | ... | ... | ... |
| 402 | 55.761498 | 37.624423 | Кузнецкий мост | 1 |
| 403 | 55.730673 | 37.446522 | Кунцевская | 1 |
| 404 | 59.891788 | 30.317873 | Московские ворота | 1 |
| 405 | 55.741375 | 37.415627 | Молодежная | 1 |
| 406 | 55.684722 | 37.855833 | Жулебино | 1 |
92 rows × 4 columns
# посмотрим количество на карте
pio.renderers.default='notebook'
plotly.offline.init_notebook_mode(connected =True)
px.set_mapbox_access_token(open('token.txt').read())
fig = px.density_mapbox(dataset_metro_num_ds,
lat = 'address.metro.lat',
lon = 'address.metro.lng',
z = 'num',
zoom=10)
fig.show('notebook')
Видны точки с большей плотностью у Москва-Сити, офисов Сбера, на Тверской. На окраинах плотность меньше, чем в центре.
# подсчет средней заработной платы от навыков
skills_money_ds = [0] * len(best_skills_ds)
num_money_ds = [0] * len(best_skills_ds)
def is_skill_money(row):
if row['skills']:
string = "".join(row['skills'])
for j, skill in enumerate(best_skills_ds):
if string.lower().find(skill) != -1:
if not pd.isna(row['salary.average']):
skills_money_ds[j] += row['salary.average']
num_money_ds[j] += 1
for index in dataset_ds_all.index:
is_skill_money(dataset_ds_all.loc[index])
for i in range(len(best_skills_ds)):
if num_money_ds[i] != 0:
skills_money_ds[i] /= num_money_ds[i]
# посмотрим на график заработной платы от навыков
fig = px.bar(x=best_skills_ds, y=skills_money_ds)
fig.update_layout(
title='Зависимость средней зарплаты от навыка',
xaxis={'title':'Навык'},
yaxis={'title':'Средняя зарплата с таким навыком'})
fig.show()
Сразу замечаем, что английский язык, c++, java, знание scala и сильно поднимают зарплату. А также hadoop, spark, javascript.
3. Анализ профессии, о которой вы мечтали в детстве
Проведите аналогичное исследование для профессии, о которой вы мечтали в детстве. Это может быть повар, учитель, пожарный и т.д. — все зависит от вас ☺.
Всегда была интересна профессия продуктового менеджера, думаю, и достаточное число вакансий на нее найдется.
# Product Manager
URL = 'https://api.hh.ru/vacancies'
json_pm = []
success = 0
for page in range(0, 20):
params = {
'text': "Product Manager",
'area': 1,
'page': page,
'per_page': 100
}
req = requests.get(URL, params)
if req.status_code == 200:
success += 1
else:
print("error code")
data = json.loads(req.content.decode())
json_pm += data['items']
print("{} descriptions from {} got".format(success, 20))
20 descriptions from 20 got
dataset_pm = pd.json_normalize(json_pm)[['id', 'name', 'employer.name', 'address.metro.station_name',
'address.metro.line_name', 'address.metro.lat', 'address.metro.lng', 'url']]
dataset_pm
| id | name | employer.name | address.metro.station_name | address.metro.line_name | address.metro.lat | address.metro.lng | url | |
|---|---|---|---|---|---|---|---|---|
| 0 | 43394185 | Lead Product Manager | Scalable Solutions | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43394185?host=hh.ru |
| 1 | 44117575 | Junior Product manager (IT, app) | Интеллектуальные социальные системы | Тульская | Серпуховско-Тимирязевская | 55.709610 | 37.622569 | https://api.hh.ru/vacancies/44117575?host=hh.ru |
| 2 | 43977928 | Product manager. Middle+/Senior | Jump Finance | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43977928?host=hh.ru |
| 3 | 42277954 | Product Manager | Scalable Solutions | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/42277954?host=hh.ru |
| 4 | 44121860 | Product manager | Нет | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44121860?host=hh.ru |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1995 | 43459190 | Продакт-менеджер/байер (косметика, БАД) | Карнаухов Дмитрий Александрович | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43459190?host=hh.ru |
| 1996 | 43477387 | Junior Manager (Manager Trainee) | Christian Dior Couture | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43477387?host=hh.ru |
| 1997 | 41180958 | Менеджер по продукту, Доставка/ Пункты выдачи ... | Ozon | Деловой центр | Большая кольцевая линия | 55.749100 | 37.539500 | https://api.hh.ru/vacancies/41180958?host=hh.ru |
| 1998 | 43606036 | Инженер по тестированию | ABBYY | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43606036?host=hh.ru |
| 1999 | 41778807 | Специалист отдела маркетинга | Имплант.ру | Савеловская | Серпуховско-Тимирязевская | 55.794054 | 37.587163 | https://api.hh.ru/vacancies/41778807?host=hh.ru |
2000 rows × 8 columns
# добавление описаний и требований
descriptions_pm = []
success = 0
for cur_id in dataset_pm['id']:
cur_url = f'https://api.hh.ru/vacancies/{cur_id}'
cur_req = requests.get(cur_url)
if cur_req.status_code == 200:
success += 1
else:
print('error code')
cur_descr = json.loads(cur_req.content.decode())
descriptions_pm += [{'id' : cur_descr['id'],
'skills' : skills_parser(cur_descr['key_skills']),
'description' : cur_descr['description'],
'experience' : cur_descr['experience'],
'salary' : cur_descr['salary']}]
print("{} descriptions from {} got".format(success, len(dataset_pm)))
2000 descriptions from 2000 got
dataset_pm_descr = pd.json_normalize(descriptions_pm)
# объединение с предыдщуей таблицей
dataset_pm_all = pd.merge(dataset_pm_descr, dataset_pm, how='inner', left_on='id', right_on='id')
dataset_pm_all.to_csv('dataset_pm_all.csv')
dataset_pm_all
| id | skills | description | experience.id | experience.name | salary.from | salary.to | salary.currency | salary.gross | salary | name | employer.name | address.metro.station_name | address.metro.line_name | address.metro.lat | address.metro.lng | url | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 43394185 | [Дизайн продукта, Аналитика требований, UI/UX ... | <p><em>Scalable Solutions – международная техн... | between3And6 | От 3 до 6 лет | 300000.0 | 450000.0 | RUR | False | NaN | Lead Product Manager | Scalable Solutions | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43394185?host=hh.ru |
| 1 | 44117575 | [Аналитическое мышление, Agile Project Managem... | <p>Компания «Интеллектуальные социальные систе... | noExperience | Нет опыта | 100000.0 | 140000.0 | RUR | False | NaN | Junior Product manager (IT, app) | Интеллектуальные социальные системы | Тульская | Серпуховско-Тимирязевская | 55.709610 | 37.622569 | https://api.hh.ru/vacancies/44117575?host=hh.ru |
| 2 | 43977928 | [Бизнес-анализ, Управление продуктом, b2b иссл... | <p><strong>О тебе</strong><br />Предлагаем теб... | between3And6 | От 3 до 6 лет | 250000.0 | NaN | RUR | True | NaN | Product manager. Middle+/Senior | Jump Finance | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43977928?host=hh.ru |
| 3 | 42277954 | [Дизайн продукта, Аналитика требований, UI/UX ... | <p><em>Scalable Solutions – международная техн... | between3And6 | От 3 до 6 лет | 200000.0 | 300000.0 | RUR | False | NaN | Product Manager | Scalable Solutions | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/42277954?host=hh.ru |
| 4 | 44121860 | [Agile Project Management, Leadership Skills, ... | <p><strong>ZoodPay</strong> is a <em>Swiss Fin... | moreThan6 | Более 6 лет | 3000.0 | 5000.0 | USD | True | NaN | Product manager | Нет | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/44121860?host=hh.ru |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 1995 | 43459190 | [Ценообразование, Мониторинг цен, Закупка това... | <p><strong>В связи с открытием нового направле... | between3And6 | От 3 до 6 лет | 25000.0 | NaN | RUR | False | NaN | Продакт-менеджер/байер (косметика, БАД) | Карнаухов Дмитрий Александрович | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43459190?host=hh.ru |
| 1996 | 43477387 | [Sales Management, Customer Relationship Manag... | <p>House of Dreams, House of Talents</p> <p>“<... | noExperience | Нет опыта | NaN | NaN | NaN | NaN | NaN | Junior Manager (Manager Trainee) | Christian Dior Couture | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43477387?host=hh.ru |
| 1997 | 41180958 | [Atlassian Jira, SQL, MS SQL, UML, Atlassian C... | <p><strong>Для развития направления сети ПВЗ и... | between3And6 | От 3 до 6 лет | NaN | NaN | NaN | NaN | NaN | Менеджер по продукту, Доставка/ Пункты выдачи ... | Ozon | Деловой центр | Большая кольцевая линия | 55.749100 | 37.539500 | https://api.hh.ru/vacancies/41180958?host=hh.ru |
| 1998 | 43606036 | [Java, Python, SQL, Atlassian Jira, Git, C#] | <p>Мы находимся в поисках младшего инженера по... | between1And3 | От 1 года до 3 лет | NaN | NaN | NaN | NaN | NaN | Инженер по тестированию | ABBYY | NaN | NaN | NaN | NaN | https://api.hh.ru/vacancies/43606036?host=hh.ru |
| 1999 | 41778807 | None | <p><strong>Лидирующая компания по продажам мат... | between1And3 | От 1 года до 3 лет | NaN | NaN | NaN | NaN | NaN | Специалист отдела маркетинга | Имплант.ру | Савеловская | Серпуховско-Тимирязевская | 55.794054 | 37.587163 | https://api.hh.ru/vacancies/41778807?host=hh.ru |
2000 rows × 17 columns
# Значит, дубликатов нет
dataset_pm_all['id'].duplicated().sum()
0
for col in dataset_pm_all.columns:
print("<{}> column has {} NaNs".format(col, len(dataset_pm_all[dataset_pm_all[col].isna()])))
<id> column has 0 NaNs <skills> column has 444 NaNs <description> column has 0 NaNs <experience.id> column has 0 NaNs <experience.name> column has 0 NaNs <salary.from> column has 1530 NaNs <salary.to> column has 1696 NaNs <salary.currency> column has 1458 NaNs <salary.gross> column has 1460 NaNs <salary> column has 2000 NaNs <name> column has 0 NaNs <employer.name> column has 0 NaNs <address.metro.station_name> column has 1111 NaNs <address.metro.line_name> column has 1111 NaNs <address.metro.lat> column has 1111 NaNs <address.metro.lng> column has 1111 NaNs <url> column has 0 NaNs
Видно, что основная проблема с пропусками в информации о зарплате. Насколько можно судить по данным, почти везде составители описаний вакансий указывают неполную вилку(либо верхнюю, либо нижнюю границы). Вместо пустой зарплаты указывать какое-то число - значит, сместить оценку, а если обрабатывать только полные данные, получим слишком маленькую выборку.Поэтому придется оставить так.
Часто не указывают валюту(будем считать, что там рубли).
Если не указывают до вычета налогов или нет, будем считать, что до вычета.
Пустую колонку salary просто дропнем.
dataset_pm_all = dataset_pm_all.drop(['salary'], axis=1)
dataset_pm_all['salary.currency'] = dataset_pm_all['salary.currency'].apply(lambda x : 'RUR' if pd.isna(x) else x)
dataset_pm_all['salary.gross'] = dataset_pm_all['salary.gross'].apply(lambda x : True if pd.isna(x) else x)
# Всего вакансий столько
len(dataset_pm_all)
2000
list_of_names_pm = []
def name_parser(name):
name = name.lower()
name = name.replace('\xa0', ' ')
name = name.replace('стажер', '')
name = name.replace('старший', '')
name = name.replace('средний', '')
name = name.replace('младший', '')
name = name.replace('intern', '')
name = name.replace('junior', '')
name = name.replace('middle', '')
name = name.replace('senior', '')
name = name.replace('team', '')
name = name.replace('lead', '')
name = name.replace('по продукту', 'продукта')
zero_split = name.split(',')
for zero in zero_split:
fisrt_split = zero.split('/')
for first in fisrt_split:
second_split = first.split('(')
for second in second_split:
third_split = second.split(')')
for n in third_split:
s = list(n)
if len(s) > 0:
if s[0] == ' ':
s[0] = ''
if s[len(s) - 1] == ' ':
s[len(s) - 1] = ''
n = "".join(s)
if n != '':
n = n.replace('-', ' ')
list_of_names_pm.append(n)
# группы вакансий
for name in dataset_pm_all['name']:
name_parser(name)
dict(sorted(Counter(list_of_names_pm).items(), key=lambda item: -item[1]))
{'product manager': 376,
'менеджер продукта': 198,
'продакт менеджер': 198,
'product owner': 76,
'категорийный менеджер': 37,
'product marketing manager': 33,
'project manager': 30,
'бренд менеджер': 26,
'ux': 22,
'product designer': 19,
'ui': 18,
'системный аналитик': 16,
'product': 14,
'brand manager': 13,
'бизнес аналитик': 12,
'менеджер по закупкам': 12,
'remote': 12,
'бренд менеджер': 12,
'ассистент продакт менеджера': 11,
'продуктовый дизайнер': 10,
'аналитик': 9,
'удаленно': 9,
'продуктовый аналитик': 9,
'qa engineer': 9,
'product analyst': 8,
'business analyst': 8,
'business development manager': 8,
'ui designer': 8,
'product менеджер': 7,
'продукт менеджер': 7,
'account manager': 7,
'mobile': 7,
'web': 7,
'маркетплейс': 7,
'it': 6,
'head of product': 6,
'косметика': 6,
'digital': 6,
'cyprus': 6,
'qa automation engineer': 6,
'менеджер проекта': 5,
'ведущий продакт менеджер': 5,
'владелец продукта': 5,
'одежда': 5,
'маркетолог': 5,
'ux designer': 5,
'consultant': 5,
'golang developer': 5,
'it рекрутер': 5,
'менеджер по продуктовому маркетингу': 5,
'analyst': 4,
'ведущий менеджер продукта': 4,
'chief product officer': 4,
'manager': 4,
'buyer': 4,
'мобильное приложение': 4,
'менеджер по развитию': 4,
'marketing manager': 4,
'rx': 4,
'technical product manager': 4,
'category manager': 4,
'руководитель проектов': 4,
'ассистент менеджера продукта': 4,
'менеджер по маркетингу': 4,
'менеджер по развитию бизнеса': 4,
'помощник продакт менеджера': 4,
'technical writer': 4,
'python': 4,
'интернет маркетолог': 4,
'it recruiter': 4,
'data analyst': 4,
'бад': 4,
'копирайтер': 4,
'менеджер по продукции': 3,
'руководитель продукта': 3,
'it product manager': 3,
'продуктовый маркетолог': 3,
'e commerce': 3,
'светотехника': 3,
'продакт менеджер': 3,
'adtech': 3,
'руководитель проекта': 3,
'crm': 3,
'дизайнер женской одежды': 3,
'billing': 3,
'логистика': 3,
'руководитель товарного направления': 3,
'b2b': 3,
'project': 3,
'sales manager': 3,
'менеджер интернет проектов': 3,
'релиз менеджер': 3,
'system analyst': 3,
'электротехника': 3,
'web аналитик': 3,
'to canada': 3,
'руководитель отдела продаж': 3,
'технический писатель': 3,
'android developer': 3,
'frontend developer': 3,
'c++ developer': 3,
'контент менеджер': 3,
'текстиль': 3,
'ux дизайнер': 3,
'маркетолог аналитик': 3,
'key account manager': 3,
'regulatory affairs specialist': 3,
'менеджер проектов': 3,
'кипр': 3,
'front end developer': 3,
'ios': 3,
'доставка': 3,
'разработчик программного обеспечения': 3,
'operations manager': 3,
'app': 2,
'chief product owner': 2,
'потребительские товары': 2,
'amazon': 2,
'data product manager': 2,
'product development manager': 2,
'технический менеджер': 2,
'product delivery manager': 2,
'+': 2,
'mobile product manager': 2,
'онлайн площадки стрим': 2,
'digital marketing manager': 2,
'production manager': 2,
'менеджер по производству': 2,
'product manager в rusprofile': 2,
'core product': 2,
'product owner b2c': 2,
'product specialist': 2,
'технический менеджер проекта': 2,
'russia': 2,
'adults': 2,
'hospital': 2,
'web сервис': 2,
'cpo': 2,
'b2c': 2,
'telecom': 2,
'менеджер продукта iot': 2,
'менеджер по продуктам глобальных рынков': 2,
'product manager b2b': 2,
'со знанием китайского языка': 2,
'менеджер продукта b2b': 2,
'расходные материалы': 2,
'швейное производство': 2,
'групп продакт менеджер': 2,
'otc': 2,
'fmcg': 2,
'маркетолог продукта': 2,
'менеджер продукта crm': 2,
'проджект менеджер': 2,
'менеджер по работе с клиентами': 2,
'product manager интернет': 2,
'digital product manager': 2,
'gamedev': 2,
'технический менеджер продукта': 2,
'delivery club': 2,
'продуктолог': 2,
'proptech': 2,
'продакт маркетолог': 2,
'cloud': 2,
'delivery manager': 2,
'scrum master': 2,
'отс': 2,
'product manager iot': 2,
'it project manager': 2,
'мобильные приложения': 2,
'продакт менеджер': 2,
'cje': 2,
'cloudgaming': 2,
'веб': 2,
'production': 2,
'менеджер по продуктам': 2,
'менеджер продуктов': 2,
'игрушки': 2,
'e com': 2,
'финансовые сервисы': 2,
'big data': 2,
'продакт менеджер по сетевому оборудованию': 2,
'project менеджер': 2,
'продукты': 2,
'devops': 2,
'менеджер продукта в тинькофф мобайл': 2,
'технолог швейного производства': 2,
'marketing director': 2,
'mobile apps': 2,
'инженер продукта': 2,
'аналитик продукта': 2,
'cto': 2,
'ведущий специалист продукта': 2,
'мужская одежда': 2,
'г. домодедово': 2,
'qa mobile engineer': 2,
'ux исследователь': 2,
'региональный менеджер': 2,
'байер': 2,
'умный дом': 2,
'спортивные товары': 2,
'copywriter': 2,
'ios developer': 2,
'менеджер по работе с ключевыми клиентами': 2,
'специалист отдела маркетинга': 2,
'application security engineer': 2,
'специалист': 2,
'ассистент': 2,
'java': 2,
'wildberries': 2,
'дистрибуция': 2,
'java разработчик': 2,
'менеджер по управлению ассортиментом': 2,
'бизнес ассистент': 2,
'женская одежда': 2,
'разработчик golang': 2,
'ткани': 2,
'php разработчик': 2,
'системный': 2,
'head of analytics': 2,
'unix': 2,
'solution architect': 2,
'react': 2,
'head of sales': 2,
'hr product manager ': 2,
'qa инженер': 2,
'delivery': 2,
'ведущий дизайнер': 2,
'менеджер по подбору персонала': 2,
'трекер': 2,
'limassol': 2,
'android разработчик': 2,
'рекрутер': 2,
'professional search & selection': 2,
'ruby on rails разработчик': 2,
'game producer': 2,
'медицинское оборудование': 2,
'finance change manager': 2,
'e commerce merchandiser': 2,
'go': 2,
'ит рекрутер': 2,
'eco system': 2,
'mobile developer': 2,
'android': 2,
'product line manager': 2,
'менеджер товарной категории': 2,
'электрооборудование': 2,
'стратегический продюсер': 2,
'data scientist': 2,
'smm': 2,
'web ux': 2,
'собственные продажи': 2,
'customer success manager': 2,
'декоративная косметика': 2,
'тестировщик': 2,
'ms dynamics 365 consultant for a food company': 2,
'contract logistics': 2,
'офис в г. домодедово': 2,
"продакт менеджер 'транспортная отрасль'": 2,
'fullstack developer': 2,
'python developer': 2,
'продукты питания': 2,
'in app calls': 2,
'sales engineer': 2,
'потребительское кредитование': 2,
'госпитальное направление': 2,
'grower manager': 2,
'фармацевтическая компания': 2,
'software engineer': 2,
'инженер по тестированию': 2,
'consulting': 2,
'product manager. +': 1,
'software development manager': 1,
'cmo': 1,
'cryptoprocessing': 1,
'product owner в сравни.ру': 1,
'product marketing manager в перспективный стартап': 1,
'менеджер продукта направление свет или электротехника': 1,
'beauty and personal care': 1,
'рынок сша': 1,
'референт': 1,
'it продукт': 1,
'product manager в образовательной сфере': 1,
'novakid product manager': 1,
'продакт менеджер по запуску новых продуктов питания': 1,
'b2b product': 1,
'косметический бренд': 1,
'product manager в tripster': 1,
'продакт менеджер мобильных приложений': 1,
'product manager dolce&gabbana': 1,
'строительная индустрия': 1,
'marketing': 1,
'менеджер по развитию сайта': 1,
'it product manager удалённо': 1,
'софт': 1,
'product older manager': 1,
'product manager с опытом дизайнера одежды': 1,
'команда активации': 1,
'направление affiliate program': 1,
'publishing platform': 1,
'e commerce product manager': 1,
'менеджер направления электронной коммерции': 1,
'координатор проектов по запуску новых продуктов': 1,
'мобильная связь': 1,
'prisma': 1,
'менеджер продукта в команду поиска': 1,
'product owner mobile app': 1,
'finuslugi_moex': 1,
'команда платформы': 1,
'b2b product marketing manager': 1,
'менеджер продукта в it': 1,
'ит': 1,
'software': 1,
'computing hardware': 1,
'product manager \\ менеджер проекта': 1,
'product manager в отдел обучения': 1,
'product manager b2b saas': 1,
'global courier quality product manager': 1,
' менеджер продукта': 1,
'менеджер по разработке продукта': 1,
'.': 1,
'e commerce manager': 1,
'head of business management and product management': 1,
'менеджер по развитию сегмента': 1,
'международное направление': 1,
'video editor': 1,
'head of b2b product': 1,
'product менеджер в каталог': 1,
'project delivery manager position': 1,
'видеонаблюдение': 1,
'скуд и биометрия': 1,
'product launch & master data manager': 1,
'product and solution expert': 1,
'pre sales': 1,
'fashion': 1,
'платформа больших данных': 1,
'product data manager': 1,
'партнерские продукты': 1,
'продакт менеджер. услуги': 1,
'technical project': 1,
'проект в cша': 1,
'product manager interventional cardiology': 1,
'эдо': 1,
'с опытом дизайнера одежды': 1,
'пассажирские сервисы и услуги': 1,
'mobile product marketing manager': 1,
'technical product manager|мобильное приложение сбербизнес': 1,
'e learning': 1,
'product – менеджер': 1,
'продакт менеджер мобильного приложения': 1,
'проект "sensef 2.0"': 1,
'application engineer': 1,
'менеджер по развитию продукта': 1,
'менеджер товарного направления': 1,
'специалист продукта': 1,
'менеджер продукта сапр': 1,
'руководитель продуктовой категории': 1,
'камеры': 1,
'менеджер отдела развития ассортимента': 1,
'online+offline': 1,
'продуктовый маркетолог product marketing manager': 1,
'product manager loss ratio': 1,
'e commerce marketplace manager': 1,
'розничный бизнес': 1,
'тиражное производство': 1,
'door hardware: mks & ahw product clusters': 1,
'digital маркетолог': 1,
'online payments': 1,
'tv': 1,
'мбт': 1,
'product owner в crypto!': 1,
'новинки': 1,
'менеджер продукта биометрии': 1,
'бренд – менеджер': 1,
'продакт маркетинг менеджер направления bim': 1,
'martech': 1,
'strategy manager': 1,
'product management analytics ': 1,
'credit cards': 1,
'gaming marketing manager': 1,
'менеджер отдела продаж': 1,
'product manager fintech': 1,
'jtbd трекер': 1,
'кмт': 1,
'принтеры': 1,
'мфу': 1,
'product manager по оптимизации конверсий': 1,
'руководитель группы развития продуктов': 1,
'btoc': 1,
'product manager': 1,
'руководитель товарного направления "умный дом"': 1,
'программа лояльности': 1,
'product manager лк': 1,
'системы безопасности': 1,
'management trainee': 1,
'global graduate programme operations': 1,
'production & supply chain': 1,
'менеджер продукта "платформа экспериментов"': 1,
'product owner experiments': 1,
'product manager в beauty проект': 1,
'менеджер по продвижению продукта': 1,
'программные продукты': 1,
'cash management': 1,
'product owner сайта e commerce': 1,
'релокация в г. новосибирск': 1,
'web проекты': 1,
'продакт менеджер по it': 1,
'product owner fintech': 1,
'growth manager': 1,
'проект чекскан': 1,
'product pre sales manager': 1,
'moscow': 1,
'менеджер продукта lab4u': 1,
'логистическая платформа': 1,
'project manager oncology': 1,
'satellite maritime': 1,
'автоматизация процессов': 1,
'product manager it': 1,
'mba': 1,
'hr product manager': 1,
'm&a and new products': 1,
'product manager мобильного приложения': 1,
'pim system': 1,
'приложение': 1,
'менеджер it проекта': 1,
'product manager mobile': 1,
'business logic': 1,
'в2в': 1,
'pandaomics global product manager': 1,
'отх продвижение': 1,
'продакт менеджер тн "сладкие подарки"': 1,
'менеджер продукта в нкря': 1,
'marketing project manager': 1,
'product marketing manager prestigio premium accessories': 1,
'цифровой бизнес': 1,
'проект: livelib': 1,
'вязаный трикотаж': 1,
'payments product manager': 1,
'product manager платформы маркетплэйс': 1,
'мелкая бытовая техника': 1,
'automotive': 1,
'product owner kasperskyos': 1,
'multinational production company': 1,
'образовательные решения': 1,
'iot для умного дома': 1,
'bi product manager': 1,
'epharm': 1,
'директор продуктового направления': 1,
'head of product marketing': 1,
'product owner в онлайн кинотеатр kion': 1,
'плк': 1,
'product manager светотехника': 1,
'поиск и веб мерчендайзинг': 1,
'video production направление': 1,
'kitchen&food': 1,
'удаленка или офис': 1,
'менеджер it продуктов': 1,
'smart city': 1,
'product manager ivi дети': 1,
'мобильные устройства': 1,
'product – manager': 1,
'product – manager сайта cdek.ru': 1,
'#cloudmts': 1,
'product marketing manager skysmart': 1,
'продуктовый менеджер': 1,
'декор': 1,
'стройхимия': 1,
'app development': 1,
'game product manager': 1,
'producer': 1,
'product and operations manager в jpharm': 1,
'офлайн развитие': 1,
'дистанционно': 1,
'промышленные компьютеры': 1,
'продакт менеджер по телефонным решениям yealink': 1,
'менеджер продукта wi fi': 1,
'growth product manager': 1,
'банковская и it сфера': 1,
'игровое направление': 1,
'скорость': 1,
'менеджер продукта voip': 1,
'руководитель продуктового направления цифровые продукты в строительстве': 1,
'product owner|sberbusiness': 1,
'product manager customs services russia': 1,
'kgh maersk company': 1,
'менеджер продукта customer experience': 1,
'goland': 1,
'product manager remote': 1,
'english': 1,
'owner': 1,
'pets': 1,
'product manager for owned brands': 1,
'tech product manager': 1,
'new business manager': 1,
'маркетинговые инструменты': 1,
'intelligent nutrition': 1,
'стрим модем': 1,
'b2с проект': 1,
'product manager endomech': 1,
'product manager направление e commerce': 1,
'pricing': 1,
'analytic': 1,
'медийная реклама': 1,
'space': 1,
'product marketing specialist': 1,
'hosting': 1,
'baremetal': 1,
'лекарственные препараты': 1,
'мой мтс экосистема': 1,
'product manager направления облачных решений': 1,
'глюкометры': 1,
'rock drilling tools': 1,
'команда crm': 1,
'мой мтс финтех': 1,
'research and development': 1,
'product manager. mobile application': 1,
'страхование': 1,
'door hardware': 1,
'security and access solutions': 1,
'color multi functional printers': 1,
'продукт crm': 1,
'sd': 1,
'mm': 1,
'ip product manager': 1,
'менеджер цифровых продуктов': 1,
'local product': 1,
'product marketing er': 1,
'образовательная it платформа': 1,
'проект r_k booking': 1,
'менеджер продуктов электронной торговли': 1,
'менеджер продукта auto id': 1,
'иб': 1,
'technical product owner': 1,
'маркетинг': 1,
'монетизация': 1,
'iot': 1,
'customer service product manager': 1,
'core platform': 1,
'проект r_k loyalty': 1,
'b2b product manager threat intelligence': 1,
'oem': 1,
'hard': 1,
'cdn': 1,
'ddos': 1,
'dns': 1,
'storage': 1,
'на развитие поиска': 1,
'проект sber account linking & sso': 1,
'склад': 1,
'site': 1,
'менеджер продукта "каталог"': 1,
'персонализация': 1,
'пылесосы': 1,
'cdp': 1,
'partner development manager': 1,
'commercial manager': 1,
'ассистента менеджера продукта': 1,
'fuel': 1,
'сфера образование': 1,
'менеджер по маркетингу продукта': 1,
'visibility & ml product manager': 1,
'руководитель цифровых продуктов e com': 1,
'томография': 1,
'true ar sdk': 1,
'электроника': 1,
'service product manager': 1,
'товары для спорта': 1,
'фарма': 1,
'multimedia': 1,
'monetization product manager keto diet app.': 1,
'fjor': 1,
'product marketing manager c2c general': 1,
'cloudkassir': 1,
'learning management system': 1,
'product manager crm': 1,
'менеджер продукта по adqm': 1,
'adss': 1,
'проект ltv engine': 1,
'в2с it': 1,
'country product manager': 1,
'снг': 1,
'эндоскопического оборудования': 1,
'project manager at edtech': 1,
'eng': 1,
'владелец': 1,
'менеджер': 1,
'продукта платформенного решения по направлению b2c': 1,
'b2c product owner': 1,
'product manager trading': 1,
'product manager cpe': 1,
'product manager for mobile app': 1,
'sberdevices:video': 1,
'product manager of content production and distribution': 1,
'product manager tv': 1,
'product owner virtual clinic': 1,
'online brand manager': 1,
'it продакт менеджер': 1,
'композиционные материалы': 1,
'портал рамблер': 1,
'marketplace supply': 1,
'extranet': 1,
'vc': 1,
'vacuum cleaner': 1,
'b2o': 1,
'fintech': 1,
'brands solutions': 1,
'pr manager': 1,
'в интернет проекты': 1,
'head product manager': 1,
'product manager payments': 1,
'demix': 1,
'kasperskyos community edition': 1,
'офис': 1,
'logistics product manager': 1,
'руководитель направления vm': 1,
'product manager в маркетинг': 1,
'cpa сеть': 1,
'product manager pitching': 1,
'consumer group head': 1,
'iot products': 1,
'pmo': 1,
'digital product': 1,
'базовые сервисы': 1,
'development and maintenance of independent price verification it system': 1,
'product marketing manager b2b': 1,
'менеджер по управлению продуктом': 1,
'promo': 1,
'software product manager': 1,
'product marketing engineer': 1,
'breakers': 1,
'на rx retail препарат': 1,
'product management \\digital marketing': 1,
'менеджер по продвижению': 1,
'направление "вакцины"': 1,
'менеджер продукта workzen': 1,
'женское здоровье': 1,
'менеджер продукта bi': 1,
'group product manager': 1,
'cardio': 1,
'product manager user growth': 1,
'er кейс направления': 1,
'smart сameras': 1,
'ai product manager': 1,
'analytics': 1,
'менеджер продукта в команду personal loans': 1,
'продакт менеджер по мнн портфелю': 1,
'marketing products': 1,
'product manager investment platform': 1,
'retention': 1,
'менеджер продуктов cash management': 1,
'биллинг': 1,
'менеджер ит продукта': 1,
'продакт менеджер отс': 1,
'smart devices': 1,
'b2b laser products': 1,
'gtm manager': 1,
'менеджер по выводу продуктов на рынок': 1,
'marketing management trainee': 1,
'brand marketing': 1,
'redken': 1,
'мобайл': 1,
'зарубежное онлайн образование': 1,
'assistant product owner': 1,
'product manager лаборатория новых продуктов': 1,
'гис': 1,
'направление "банки и интеграции"': 1,
'менеджер продукта камеры signalq': 1,
'research manager': 1,
'продакт менеджер онлайн сервиса': 1,
'digital agency for blockchain': 1,
'crypto businesses': 1,
'тренинг менеджер': 1,
'продукт': 1,
'integration manager': 1,
'офисная недвижимость': 1,
'продакт менеджер тн "спортивная одежда"': 1,
'продакт менеджер светотехнической продукции': 1,
'пк': 1,
'мониторы': 1,
'специализированные voip решения': 1,
'софтверная коммуникационная платформа 3cx': 1,
'продакт менеджер "игровые аксессуары"': 1,
'гейминг': 1,
'product owner erp': 1,
'автоматизация сферы услуг': 1,
'бренд': 1,
'продакт': 1,
' менеджер по косметике': 1,
'it product платформа ads': 1,
'cpo\\директор продукта': 1,
'customer journey expert': 1,
'pr': 1,
'бренд менеджер продукта': 1,
'бытовая химия': 1,
'микрофинансовая организация': 1,
'филиппины': 1,
'менеджер по продукта': 1,
'product service manager': 1,
'vas & others': 1,
'. менеджер по имплементации сервисных услуг': 1,
'инженер тн "электрогирлянды"': 1,
'marketing & communications manager': 1,
'account technology manager': 1,
'er': 1,
'менеджер по продуктам видеонаблюдение и видеоаналитика': 1,
'направление продуктового маркетинга': 1,
'продакт менеджер категории бытовая техника': 1,
'ведущий технический специалист': 1,
'технический продакт менеджер': 1,
'us в2в sales manager': 1,
'ai solutions': 1,
'товары для дома': 1,
'категорийный менеджер по продуктам питания': 1,
'кондитерские изделия': 1,
'интернет эквайринг': 1,
'rtb manager fx4cash': 1,
'ux ui': 1,
'qa': 1,
'управление качеством': 1,
'групп бренд менеджер': 1,
'pre sale': 1,
'sale в digital': 1,
'спортивный инвентарь': 1,
'руководитель направления': 1,
'продакт менеджер "огнестойкие решения по прокладке кабеля"': 1,
'trade marketing manager': 1,
'руководитель проектов внедрения': 1,
'web portals & mobile apps': 1,
'стм женская одежда': 1,
'руководитель по развитию новых бизнес вертикалей в it': 1,
'account director fmcg key account': 1,
'менеджер по размещению заказов на фабриках': 1,
'технолог одежды': 1,
'тм savage': 1,
'медицинские оборудование': 1,
'менеджер по продуктам информационной безопасности': 1,
'менеджер проектов разработки bi систем': 1,
'product менеджер': 1,
'руководитель категории': 1,
'аксессуары': 1,
'ведущий бренд менеджер': 1,
'исходящие роботы и робот помощник': 1,
'business intelligence analyst': 1,
'спортивная одежда': 1,
'удаленная работа': 1,
'head of training center': 1,
'atos': 1,
'руководитель отдела product маркетинга': 1,
'направление фитнес товары': 1,
'руководитель отдела маркетинговых проектов': 1,
'продакт менеджер направление "косметика"': 1,
'director of marketing': 1,
'аккаунт менеджер': 1,
'продуктовый технический писатель': 1,
'ux writer': 1,
'менеджер операционных проектов b2b': 1,
'со знанием sql': 1,
'техника для корпоративного канала': 1,
'продакт менеджер отдела маркетинга': 1,
'продакт менеджер главный привод лифта': 1,
'лебедки безредукторные': 1,
'digital рекрутер': 1,
'продакт менеджер тн "спорт': 1,
'спортивные товары"': 1,
'продакт менеджер на швейную фурнитуру': 1,
'project communications officer': 1,
'community manager': 1,
'maps department': 1,
'руководитель проектов по развитию в2с сервисов': 1,
'cx researcher': 1,
'оборудование для реанимации и анестезиологии': 1,
'teсh er': 1,
'технический директор': 1,
'qa ': 1,
'quality engineering manager': 1,
'project support specialist': 1,
'marketing webinars specialist': 1,
'demo engineer': 1,
'strategic designer': 1,
'в торговую компанию "классик посуда"': 1,
'бизнес аналитик продукта "поиск"': 1,
'cx исследователь': 1,
'исследователь клиентского опыта': 1,
'engineering manager': 1,
'product manager crm. дивизион `массовая персонализация`': 1,
'инвестиционное направление': 1,
'portfolio sales professional us': 1,
'ультразвук': 1,
'товары для детей': 1,
'дизайнер мобильных приложений': 1,
'mobile app designer': 1,
'world of tanks': 1,
'менеджер по развитию бизнеса netapp': 1,
'развитие цифровой платформы': 1,
'менеджер по продажам it продукта': 1,
'business functional analyst': 1,
'treasury trade lifecycle': 1,
'software developer search': 1,
'обеспечение безопасности iot решений': 1,
'продакт менеджер по закупкам туристического снаряжения и одежды': 1,
'продакт менеджер в отдел полиграфического производства': 1,
'гап': 1,
'недвижимость': 1,
'руководитель интернет проектов': 1,
'trade marketing director': 1,
'of the web': 1,
'бренд менеджер в категории творожных сыров': 1,
'customer engagement manager': 1,
'менеджер продукта в команду роста малого бизнеса': 1,
'продакт менеджер направление «канцтовары»': 1,
'руководитель отдела по развитию операционных ит продуктов': 1,
'sales er': 1,
'менеджер проектов с обязанностями продакт менеджера и бэк офиса': 1,
'директор продукта comdi': 1,
'управляющий ассортиментом': 1,
'fresh': 1,
'продакт менеджер мужская коллекция': 1,
'интерьерное освещение': 1,
'qa ': 1,
'remotе': 1,
'продукт менеджер по оборудованию': 1,
'предназначенному для отопительных систем.': 1,
'менеджер по работе с производством': 1,
'chief technology officer': 1,
'продукты питания консервы': 1,
'mobile qa engineer': 1,
'head of t&d': 1,
'chief datа officer': 1,
'менеджер по лицензированию microsoft': 1,
'продакт менеджер со знанием китайского языка': 1,
'помощник продакт менеджера по направлению «анестезиология реанимация»': 1,
'компьютерная периферия': 1,
'руководитель производства в бренд одежды': 1,
'руководитель по развитию': 1,
'направление спортивная обувь': 1,
'маркетплейсы': 1,
'жилая недвижимость': 1,
'представитель по маркетингу и развитию бизнеса': 1,
' product manager': 1,
'ассистент продакта': 1,
'ассистент отдела закупок': 1,
'операционный директор в онлайн школу': 1,
'quality assurance and regulatory affairs er': 1,
'менеджер маркетолог отдела фармацевтического маркетинга': 1,
'диджитал маркетолог': 1,
'regulatory affairs scientist': 1,
'трейд маркетолог': 1,
'devops ': 1,
'.net developer': 1,
'консультант по дезинфицирующим средствам': 1,
'обращение отходов тко': 1,
'тбо': 1,
'руководитель отдела интернет рекламы': 1,
'digital group head': 1,
'платный трафик': 1,
'методист продюсер по математике': 1,
'менеджер продукта "shop in shop"': 1,
'strategy & operations group': 1,
'consulting department': 1,
'групп продакт менеджер направления педиатрия': 1,
'таргетолог': 1,
'продакт менеджер направление конфеты': 1,
'посуда': 1,
'мягкие игрушки': 1,
'сервисы': 1,
'товарный менеджер': 1,
' бренд менеджер': 1,
'design musescore': 1,
'ведущий системный аналитик': 1,
'менеджер по закупкам ит оборудования': 1,
'руководитель товарного направления по локальным рынкам': 1,
'swift': 1,
'контент креатор': 1,
'контент криэйтор': 1,
'content creator': 1,
'продюсер в онлайн школу для hr': 1,
'it analyst': 1,
'trading front office systems': 1,
'crm database and analytics specialist': 1,
'крепкий алкоголь': 1,
'outside service providers supervisor': 1,
'руководитель по работе с агентами': 1,
'ит интегратор': 1,
'системные интеграторы': 1,
'react native developer': 1,
'подписка тинькофф': 1,
'tinkoff pro': 1,
'руководитель продуктового направления': 1,
'клипсы и петли колбасные': 1,
'logistics coordinator': 1,
'менеджер продукта жилой недвижимости': 1,
'рб': 1,
'г.минск': 1,
'маркетолог продукта yclients для сегмента beauty бизнес': 1,
'digital manager': 1,
'growth er': 1,
'руководитель команды роста': 1,
'appstore optimization specialist': 1,
'технологии онлайн продаж': 1,
'python разработчик': 1,
'\\': 1,
'principal software engineer': 1,
'в департамент маркетинга': 1,
'отдела маркетинга': 1,
'server+cloud': 1,
'менеджер продукта в команду мобильного банка': 1,
'frontend разработчик': 1,
'ведущий разработчик мобильных приложений': 1,
'e merchandiser': 1,
'визуальный онлайн мерчендайзер в интернет магазин': 1,
'ассистент менеджера по закупкам': 1,
'creed': 1,
'vilhelm parfumerie': 1,
'продакт менеджер направление «детского творчества»': 1,
'инженер по качеству': 1,
'quality production er': 1,
'associate': 1,
'web разработчик': 1,
'web manager': 1,
'руководитель smm': 1,
'руководитель отдела интернет маркетинга': 1,
'ведущий менеджер по индивидуальному туризму': 1,
'kotlin backend developer': 1,
'cln java developer': 1,
'java software engineer': 1,
'1 day hiring event': 1,
'специалист по работе с маркетплейсами ozon': 1,
'собственные стм': 1,
'тестировщик по': 1,
'архитектор программного обеспечения': 1,
'координатор отдела управления продукцией': 1,
'ux редактор': 1,
'специалист по тестированию': 1,
'менеджер по продажам it техники': 1,
'full stack developer': 1,
'php': 1,
'venture architect': 1,
'контент менеджер в интернет магазин': 1,
'продуктолог на направление онлайн торговли': 1,
'руководитель отдела технического сопровождения съемок': 1,
'фото и видео': 1,
'developer fullstack platform ops': 1,
'sdet': 1,
'manual qa engineer': 1,
'помощник менеджера продукта': 1,
'ассистент менеджера': 1,
'специалист по планированию': 1,
'scheduling executive': 1,
'менеджер по продажам и работе с клиентами': 1,
'контент менеджер маркетплейсов': 1,
'в офисе': 1,
'без удалённой работы': 1,
'head of technical documentation': 1,
'sale': 1,
'детская одежда': 1,
'quik system administrator': 1,
'oracle dba': 1,
'support engineer': 1,
'офтальмология': 1,
'c++ разработчик': 1,
'crm product owner': 1,
'salesforce': 1,
'relocation to kuala lumpur': 1,
'pastry chef': 1,
'шеф кондитер': 1,
'operational excellence director': 1,
'burkina faso': 1,
'saas кредитный скоринг': 1,
'head of it department': 1,
'менеджер по закупкам со знанием китайского и английского языков': 1,
'менеджер отдела логистики': 1,
'php программист': 1,
'clickhouse': 1,
'инженер рэа': 1,
'менеджер по продажам химического сырья': 1,
'направление бытовая химия': 1,
'data visualization developer': 1,
'системы управления контентом': 1,
'начальник отдела для развития цифровых сервисов информационной платформы': 1,
'менеджер продукта погода': 1,
'ассистент менеджера по вэд': 1,
'продакт менеджер по производству одежды': 1,
'россия': 1,
'продукт менеджер по работе с маркетплейсами': 1,
'backend': 1,
'дизайнер ': 1,
"байер женской верхней одежды тм o'stin": 1,
'разработчик javascript': 1,
'node.js back end': 1,
'business manager': 1,
'full stack разработчик': 1,
'php yii2': 1,
'angular': 1,
'ассистент менеджера по продкуту': 1,
'head of foodservice': 1,
'"наш мтс"': 1,
'инженер отдела проектно технической поддержки и развития товарных направлений': 1,
'менеджер отдела закупок': 1,
'analyst in liability management': 1,
'treasury': 1,
'system architect': 1,
...}
Выделяются группы product manager, product owner, бренд менеджер, категорийный менеджер. Бывают еще менеджеры по закупкам, бренд менеджеры,qa engineer, бизнес аналитик и тд.
dataset_pm_all['salary.currency'].value_counts()
RUR 1964 USD 29 EUR 7 Name: salary.currency, dtype: int64
dataset_pm_all['salary.average'] = np.nan
# приводим зарплату к рублевому эквиваленту
for index in dataset_pm_all.index:
if dataset_pm_all.loc[index, 'salary.currency'] == 'USD' :
if(dataset_pm_all.loc[index, 'salary.from']):
dataset_pm_all.loc[index, 'salary.from'] *= 80
if dataset_pm_all.loc[index, 'salary.to']:
dataset_pm_all.loc[index, 'salary.to'] *= 80
elif dataset_pm_all.loc[index, 'salary.currency'] == 'EUR':
if(dataset_pm_all.loc[index, 'salary.from']):
dataset_pm_all.loc[index, 'salary.from'] *= 90
if dataset_pm_all.loc[index, 'salary.to']:
dataset_pm_all.loc[index, 'salary.to'] *= 90
dataset_pm_all.loc[index, 'salary.currency'] = 'RUR'
salary_from = dataset_pm_all.loc[index, 'salary.from']
salary_to = dataset_pm_all.loc[index, 'salary.to']
if salary_from is not None:
dataset_pm_all.loc[index, 'salary.average'] = salary_from
if salary_to is not None:
dataset_pm_all.loc[index, 'salary.average'] = salary_to
if (salary_from is not None) & (salary_to is not None):
dataset_pm_all.loc[index, 'salary.average'] = (salary_from + salary_to) / 2
# для средней вилки
dataset_pm_all['salary.average'].agg(['count', 'mean', 'median', 'min', 'max'])
count 232.00000 mean 152577.62931 median 125000.00000 min 20000.00000 max 560000.00000 Name: salary.average, dtype: float64
# обработаем навыки
list_of_skills_pm = []
def skill_parser(skills):
for l in skills:
list_of_skills_pm.append(l.lower())
for skills in dataset_pm_all['skills']:
if skills:
skill_parser(skills)
dict(sorted(Counter(list_of_skills_pm).items(), key=lambda item: -item[1]))
{'английский язык': 362,
'product management': 287,
'управление продуктом': 282,
'управление проектами': 237,
'маркетинговый анализ': 168,
'ms powerpoint': 159,
'работа в команде': 151,
'разработка нового продукта': 143,
'agile project management': 137,
'запуск новых продуктов': 132,
'project management': 126,
'бизнес-анализ': 111,
'sql': 107,
'scrum': 93,
'проведение презентаций': 88,
'управление командой': 86,
'аналитическое мышление': 82,
'atlassian jira': 82,
'креативность': 74,
'ux': 73,
'ведение переговоров': 71,
'развитие продаж': 69,
'маркетинговые исследования': 68,
'подготовка презентаций': 66,
'аналитические исследования': 65,
'деловая коммуникация': 65,
'ценообразование': 64,
'adobe photoshop': 61,
'python': 61,
'обучение и развитие': 61,
'google analytics': 60,
'анализ рынка': 59,
'разработка технических заданий': 58,
'ориентация на результат': 57,
'продвижение бренда': 55,
'ui': 52,
'b2b продажи': 52,
'организаторские навыки': 49,
'закупки': 46,
'analytical skills': 45,
'team management': 43,
'presentation skills': 43,
'java': 39,
'business english': 37,
'навыки презентации': 37,
'управление продажами': 37,
'вывод продукта на рынок': 36,
'internet marketing': 36,
'постановка задач разработчикам': 36,
'marketing analysis': 36,
'деловая переписка': 36,
'e-commerce': 35,
'стратегический маркетинг': 35,
'разработка маркетинговой стратегии': 35,
'закупка товаров и услуг': 34,
'git': 34,
'leadership skills': 33,
'ms excel': 33,
'product marketing': 33,
'ms outlook': 33,
'анализ конкурентной среды': 32,
'crm': 32,
'sales management': 32,
'negotiation skills': 32,
'business development': 31,
'грамотная речь': 31,
'маркетинговые коммуникации': 30,
'adobe illustrator': 29,
'активные продажи': 29,
'маркетинговое планирование': 28,
'ms project': 28,
'пользователь пк': 28,
'разработка продукта': 27,
'управление интернет-проектами': 27,
'проектирование пользовательских интерфейсов': 26,
'интернет-реклама': 26,
'работа с поставщиками': 26,
'javascript': 26,
'ms access': 25,
'product development': 24,
'ios': 24,
'sales skills': 24,
'планирование маркетинговых кампаний': 23,
'системный анализ': 23,
'digital marketing': 23,
'b2b marketing': 23,
'time management': 23,
'планирование продаж': 22,
'системное мышление': 22,
'html': 22,
'информационные технологии': 22,
'дизайн интерфейсов': 22,
'teamplayer': 21,
'работа с большим объемом информации': 21,
'управление временем': 21,
'ms sql': 21,
'ms visio': 21,
'teamleading': 21,
'linux': 21,
'яндекс.метрика': 20,
'управление отношениями с клиентами': 20,
'анализ ассортиментной линейки': 20,
'бренд-менеджмент': 20,
'launching new products': 19,
'android': 19,
'грамотность': 19,
'стратегическое мышление': 19,
'мониторинг рынка': 19,
'coreldraw': 19,
'торговая площадка': 19,
'atlassian confluence': 18,
'анализ данных': 18,
'навыки переговоров': 18,
'start-up project': 18,
'заключение договоров': 18,
'postgresql': 18,
'social media marketing': 17,
'market research': 17,
'оптимизация бизнес-процессов': 17,
'подбор персонала': 16,
'php': 16,
'figma': 16,
'аналитика': 15,
'управление персоналом': 15,
'1с: торговля': 15,
'клиентоориентированность': 15,
'публичные выступления': 15,
'1с: предприятие 8': 15,
'mysql': 15,
'css': 14,
'дизайн': 14,
'планирование ассортимента': 14,
'документооборот': 14,
'тестирование': 14,
'многозадачность': 13,
'деловое общение': 13,
'customer service': 13,
'strategic marketing': 13,
'business analysis': 13,
'brand management': 13,
'google adwords': 13,
'поиск и привлечение клиентов': 13,
'руководство коллективом': 12,
'разработка концепции': 12,
'оценка потребностей клиентов': 12,
'product promotion': 12,
'sales planning': 12,
'навыки межличностного общения': 12,
'customer relationship management': 12,
'расстановка приоритетов': 12,
'развитие бренда': 12,
'бизнес-планирование': 12,
'управление производством': 12,
'marketing communication': 12,
'it': 12,
'анализ продаж': 12,
'прототипирование': 11,
'teambuilding': 11,
'копирайтинг': 11,
'тестирование пользовательского интерфейса': 11,
'умение работать в команде': 11,
'обучение персонала': 11,
'retail': 11,
'системный подход': 11,
'организация мероприятий': 11,
'холодные продажи': 11,
'uml': 11,
'data analysis': 11,
'c++': 11,
'проектный менеджмент': 10,
'smm': 10,
'управление ассортиментом': 10,
'a/b тесты': 10,
'autocad': 10,
'управление бизнес процессами': 10,
'анализ бизнес показателей': 10,
'b2b маркетинг': 10,
'стратегическое планирование': 10,
'аналитические способности': 10,
'ms office': 10,
'bpmn': 10,
'контроль качества': 10,
'аналитика продаж': 10,
'прямые продажи': 10,
'написание текстов': 10,
'web-дизайн': 10,
'планирование закупок': 10,
'aws': 10,
'kotlin': 10,
'budgeting': 10,
'saas': 9,
'бюджетирование': 9,
'планирование рекламных кампаний': 9,
'поиск информации в интернет': 9,
'яндекс.директ': 9,
'adobe indesign': 9,
'планирование': 9,
'техническая документация': 9,
'data mining': 9,
'api': 9,
'функциональное тестирование': 9,
'node.js': 9,
'typescript': 9,
'web аналитика': 8,
'custdev': 8,
'проведение опросов': 8,
'1с-битрикс': 8,
'интернет маркетинг': 8,
'product owner': 8,
'product manager': 8,
'телефонные переговоры': 8,
'html5': 8,
'веб-аналитика': 8,
'наполнение контентом': 8,
'письменный перевод': 8,
'seo': 8,
'software development': 8,
'qa': 8,
'react': 8,
'проектная документация': 7,
'исследования рынка': 7,
'mac os': 7,
'управление процессами': 7,
'прогнозирование': 7,
'медицинское оборудование': 7,
'торговый маркетинг': 7,
'маржинальный анализ': 7,
'risk management': 7,
'business planning': 7,
'strategic planning': 7,
'контекстная реклама': 7,
'организация презентаций': 7,
'разработка по': 7,
'запуск нового бренда': 7,
'startup': 7,
'подготовка коммерческих предложений': 7,
'organization skills': 7,
'internet': 7,
'рекрутмент': 7,
'spring framework': 7,
'angularjs': 7,
'django framework': 7,
'c#': 7,
'rest': 7,
'golang': 7,
'управление талантами': 6,
'cjm': 6,
'управление разработкой': 6,
'pmbok': 6,
'customer development': 6,
'внутренние коммуникации': 6,
'организационное развитие': 6,
'1с: управление торговлей': 6,
'продуктовая аналитика': 6,
'реклама': 6,
'дизайн одежды': 6,
'mobile marketing': 6,
'контроль отгрузок': 6,
'проведение тестирований': 6,
'развитие продукта': 6,
'информационная безопасность': 6,
'навыки продаж': 6,
'mongodb': 6,
'investment banking': 6,
'usability': 6,
'ооп': 6,
'web design': 6,
'swift': 6,
'it recruitment': 6,
'big data': 6,
'fintech': 5,
'axure rp': 5,
'мотивация персонала': 5,
'product': 5,
'управление рисками': 5,
'лидерство': 5,
'мобильность': 5,
'моделирование бизнес процессов': 5,
'mvp': 5,
'xml': 5,
'управление бюджетом': 5,
'erp': 5,
'ms project expert': 5,
'брендинг': 5,
'b2c marketing': 5,
'электронный документооборот': 5,
'1с: документооборот': 5,
'мониторинг цен': 5,
'управленческие навыки': 5,
'системная интеграция': 5,
'базы данных': 5,
'финансовая отчетность': 5,
'user growth': 5,
'growth hacking': 5,
'план продвижения': 5,
'категорийный менеджмент': 5,
'ориентация на клиента': 5,
'маркетинг услуг': 5,
'взаимодействие с инвестиционными фондами': 5,
'биржевые торги': 5,
'графический дизайн': 5,
'тренинги': 5,
'supply chain management': 5,
'sketch': 5,
'ценовая политика': 5,
'статистический анализ': 5,
'ruby': 5,
'azure': 5,
'регресcионное тестирование': 5,
'key account management': 5,
'test case': 5,
'redis': 5,
'kafka': 5,
'стратегический менеджмент': 4,
'pr': 4,
'abc-анализ': 4,
'swot анализ': 4,
'управленческая отчетность': 4,
'mathcad': 4,
'составление бизнес-плана': 4,
'умение принимать решения': 4,
'customer journey map': 4,
'проверка гипотез': 4,
'аналитический склад ума': 4,
'ответственность': 4,
'стратегия развития': 4,
'управление маркетингом': 4,
'ведение переписки': 4,
'делопроизводство': 4,
'лидогенерация': 4,
'конкурентная аналитика': 4,
'формирование бюджета': 4,
'умение работать в коллективе': 4,
'iot': 4,
'jira': 4,
'broker': 4,
'планирование карьеры': 4,
'договоры поставки': 4,
'электротехническое оборудование': 4,
'электрооборудование': 4,
'промышленное оборудование, техника, станки и комплектующие': 4,
'строительство': 4,
'проведение семинаров': 4,
'sales forecasting': 4,
'e-mail marketing': 4,
'коммуникабельность': 4,
'sap': 4,
'trade marketing': 4,
'высокая скорость печати': 4,
'управление лояльностью потребителей': 4,
'тайм-менеджмент': 4,
'социальные сети': 4,
'работа с базами данных': 4,
'venture capital': 4,
'ипотечное кредитование': 4,
'adobe after effect': 4,
'scala': 4,
'документальное сопровождение': 4,
'mobile': 4,
'sap project': 4,
'selenium': 4,
'go': 4,
'docker': 4,
'позиционирование бренда': 4,
'математическая статистика': 4,
'веб-дизайн': 4,
'json api': 4,
'oracle': 4,
'b2b исследования': 3,
'медиапланирование': 3,
'project documentation': 3,
'продуктовые метрики': 3,
'самостоятельность': 3,
'kanban': 3,
'b2c маркетинг': 3,
'первичные документы': 3,
'aso': 3,
'руководство командой разработчиков': 3,
'обработка видео': 3,
'1с: производство': 3,
'seo оптимизация': 3,
'erp systems': 3,
'развитие ключевых клиентов': 3,
'advertising': 3,
'умение планировать': 3,
'продакт менеджмент': 3,
'продуктовый маркетинг': 3,
'логистика': 3,
'дистанционное обучение': 3,
'public speaking': 3,
'c2c': 3,
'trading': 3,
'cистемы управления базами данных': 3,
'разработка логистики': 3,
'стратегический анализ': 3,
'промышленное, бытовое электрооборудование и электротехника': 3,
'product marketing manager': 3,
'электротехническое': 3,
'маркетинговая стратегия': 3,
'выставочная деятельность': 3,
'менеджер продукта': 3,
'управление производственным персоналом': 3,
'coreldraw photo draw': 3,
'сельское хозяйство': 3,
'сопровождение клиентов': 3,
'анализ рисков': 3,
'бюджетирование закупок': 3,
'продакт': 3,
'работа на выставках': 3,
'составление договоров': 3,
'ms word': 3,
'#торговая площадка': 3,
'деловая этика': 3,
'медицинская документация': 3,
'project expert': 3,
'ведение отчетности': 3,
'power bi': 3,
'miro': 3,
'principle': 3,
'инженерные системы': 3,
'контроль поставок': 3,
'ассортиментная матрица': 3,
'business process management': 3,
'логистика поставок': 3,
'работа с ключевыми клиентами': 3,
'прямой поиск': 3,
'ruby on rails': 3,
'оптимизация закупок': 3,
'postman': 3,
'lean production': 3,
'розничная торговля': 3,
'asyncio': 3,
'c/c++': 3,
'objective-c': 3,
'hibernate orm': 3,
'jquery': 3,
'rabbitmq': 3,
'angular': 3,
'vba': 3,
'проведение промо акций': 3,
'vue.js': 3,
'cloud': 3,
'crypto': 3,
'kubernetes': 3,
'recruitment': 3,
'unix': 3,
'design': 3,
'sap erp': 3,
'matlab': 3,
'tableau': 3,
'delphi': 3,
'transact-sql': 3,
'написание статей': 3,
'treasury and liquidity management': 3,
'дизайн продукта': 2,
'аналитика требований': 2,
'ui/ux дизайн': 2,
'системная аналитика': 2,
'разработка интерфейсов': 2,
'интервьюирование': 2,
'b2c': 2,
'мобильные приложения': 2,
'b2c продажи': 2,
'edtech': 2,
'сбор и анализ информации': 2,
'амбициозность': 2,
'development': 2,
'xyz-анализ': 2,
'pricing': 2,
'проектирование': 2,
'jtbd': 2,
'people management': 2,
'google docs': 2,
'unit-экономика': 2,
'творческое мышление': 2,
'photography': 2,
'1с: склад': 2,
'p&l': 2,
'firebase': 2,
'видеомонтаж': 2,
'обработка изображений': 2,
'сертификация продукции': 2,
'первичная бухгалтерская документация': 2,
'archicad': 2,
'корпоративные продажи': 2,
'производственный контроль': 2,
'amplitude': 2,
'gtm': 2,
'коммерция': 2,
'разработка стратегии продвижения продуктов': 2,
'работа в режиме многозадачности': 2,
'пресейл': 2,
'1с: торговля и склад': 2,
'adobe premier pro': 2,
'микроэлектроника': 2,
'радиоэлектроника': 2,
'gsm': 2,
'тестирование продуктов': 2,
'ведение проектов по продуктам': 2,
'радиотехника': 2,
'умение расставлять приоритеты': 2,
'организационные навыки': 2,
'управление закупками': 2,
'консультативные продажи': 2,
'техническая продукция': 2,
'светотехника': 2,
'оптовая торговля': 2,
'энергетика': 2,
'электроника, приборостроение, бытовая техника, компьютеры и оргтехника': 2,
'продажи': 2,
'выездные мероприятия': 2,
'инновационный менеджмент': 2,
'video production': 2,
'networking': 2,
'строительно-отделочные работы': 2,
'маркетплейс': 2,
'ci/cd': 2,
'работа с vip клиентами': 2,
'ведение активных клиентов': 2,
'it product': 2,
'рыночное позиционирование': 2,
'организация конференций': 2,
'водительское удостоверение категории b': 2,
'маркетинговые стратегии': 2,
'техническая поддержка': 2,
'продажа страховых продуктов': 2,
'idef0': 2,
'logistics management': 2,
'разработка поисковых технологий': 2,
'маркетплейсы': 2,
'разработка проектной документации': 2,
'interviews': 2,
'управление товарными запасами': 2,
'управление поставками': 2,
'разработка инструкций': 2,
'обучение': 2,
'google tag manager': 2,
'b2b': 2,
'организация семинаров': 2,
'организация выставок': 2,
'перевод технической документации': 2,
'analysis': 2,
'hybris': 2,
'crowdfunding': 2,
'fundraising': 2,
'китайский язык': 2,
'складская логистика': 2,
'user acquisition': 2,
'архитектура': 2,
'проектирование зданий и сооружений': 2,
'знание продукта': 2,
'развитие дистрибуции': 2,
'employer branding': 2,
'adobe design': 2,
'fmcg продажи': 2,
'таргетинг': 2,
'работа с оргтехникой': 2,
'точность и внимательность к деталям': 2,
'косметология': 2,
'event management': 2,
'social media': 2,
'marketing events': 2,
'#коммерция': 2,
'java se': 2,
'gcp': 2,
'service design': 2,
'java ee': 2,
'дистрибуция': 2,
'мотивация': 2,
'elasticsearch': 2,
'консультирование': 2,
'1с: предприятие': 2,
'xcode': 2,
'charles proxy': 2,
'android studio': 2,
'маркетинг': 2,
'вэд': 2,
'ведение групп в социальных сетях': 2,
'design patterns': 2,
'мерчандайзинг': 2,
'business process improvement': 2,
'формирование продуктовой линейки': 2,
'контроль и анализ ценообразования': 2,
'zeplin': 2,
'http': 2,
'angular 9': 2,
'rxjs': 2,
'ит': 2,
'telecom': 2,
'apple search ads': 2,
'clickhouse': 2,
'организация деловых поездок': 2,
'немецкий язык': 2,
'qt': 2,
'apache maven': 2,
'подбор технического персонала': 2,
'phpunit': 2,
'корректура текстов': 2,
'unit testing': 2,
'оперативный поиск информации в сети интернет': 2,
'видеосъемка': 2,
'seo-копирайтинг': 2,
'powershell': 2,
'офисная техника': 2,
'bss': 2,
'laravel': 2,
'corporate finance': 2,
'vue': 2,
'paas': 2,
'redux': 2,
'оборачиваемость товара на складе': 2,
'управление рентабельностью продаж': 2,
'ms visual studio': 2,
'продвижение сайтов': 2,
'проектно-конструкторская деятельность': 2,
'css3': 2,
'wms': 2,
'selenium ide': 2,
'audio processing': 2,
'локализация продукта': 2,
'приоритезация бэклога': 2,
'финансы': 2,
'agile': 2,
'финансовый менеджмент': 2,
'финансовые продукты': 2,
'cms': 2,
'pandas': 2,
'ad hoc analysis': 2,
'automation': 2,
'presale': 2,
'электротехника': 2,
'электроснабжение': 2,
'проектные продажи': 2,
'symfony': 2,
'собственные продажи': 2,
'account management': 2,
'windows 7': 2,
'опыт в банковской или финансовой сфере': 2,
'#маркетпэйс': 2,
'strategic management': 2,
'coo': 2,
'process automation': 2,
'devops': 2,
'cms wordpress': 2,
'operations management': 2,
'сувенирная продукция': 2,
'регресионное тестирование': 2,
'turbo pascal': 2,
'менеджмент': 1,
'cryptocurrency': 1,
'crypto trading': 1,
'предпринимательство': 1,
'fmcg': 1,
'beauty and personal care': 1,
'digital product': 1,
'product development manager': 1,
'анализ потребностей аудитории': 1,
'управление ассортиментной матрицей': 1,
'стрессоустойчивость': 1,
'целеустремленность': 1,
'метрики продукта': 1,
'юнит экономика': 1,
'unit экономика': 1,
'жизненный цикл продукта': 1,
'unit economics': 1,
'продуктовая стратегия': 1,
'market positioning': 1,
'ms axapta': 1,
'web-разработка': 1,
'web-сервисы': 1,
'csv': 1,
'json': 1,
'exponea': 1,
'mercaux': 1,
'eyezone': 1,
'управление метриками': 1,
'ведение мобильных рекламных кампаний': 1,
'запуск федеральных рекламных кампаний': 1,
'account based marketing': 1,
'hadi': 1,
'ice': 1,
'stakeholders management': 1,
'advanced english': 1,
'safe': 1,
'mass training': 1,
'online trainings': 1,
'training program': 1,
'a platform for learning': 1,
'разработка регламентов': 1,
'windows os': 1,
'cust dev': 1,
'b2c продукт': 1,
'товарная матрица': 1,
'изучение рынка': 1,
'торговля': 1,
'ms expert': 1,
'аналитика данных': 1,
'производство рекламных материалов': 1,
'размещение pos материалов': 1,
'category management': 1,
'soa': 1,
'инвестиционный анализ': 1,
'структурные продукты': 1,
'product backlog': 1,
'story mapping': 1,
'прототипы': 1,
'corel draw': 1,
'продуктовый дизайн': 1,
'поисковая оптимизация мобильного приложения': 1,
'appmetrica': 1,
'crashlytics': 1,
'ms dynamics crm': 1,
'фотография': 1,
'репортажная фотосъемка': 1,
'проведение тендеров': 1,
'контрактное производство': 1,
'умение вести переговоры': 1,
'email маркетинг': 1,
'task manager': 1,
'blockchain': 1,
'financial management': 1,
'развитие бизнеса': 1,
'google optimize': 1,
'tilda.cc': 1,
'cro': 1,
'разработка мобильных приложений': 1,
'btoc': 1,
'телемаркетинг': 1,
'работа с жалобами клиентов': 1,
'телекоммуникационное оборудование': 1,
'e-learning': 1,
'vsat': 1,
'l-band': 1,
'maritime': 1,
'спутниковая связь': 1,
'морские суда': 1,
'создание сайтов': 1,
'продвижение объекта': 1,
'pinnacle studio': 1,
'бизнес-моделирование': 1,
'создание контактного центра под клиента': 1,
'installment loans': 1,
'яндекс метрика': 1,
'google аналитика': 1,
'яндекс директ': 1,
'google ads': 1,
'digital': 1,
'romi': 1,
'viral growth': 1,
'growth manager': 1,
'mobile app': 1,
'экономический аудит': 1,
'mystem': 1,
'лингвистика': 1,
'продуктовая разработка': 1,
'продажи через интернет': 1,
'industrial design language': 1,
'маркетинг, реклама, pr': 1,
'управление бэклогом': 1,
'индустриальные сети': 1,
'асу тп': 1,
'плк': 1,
'контроллеры': 1,
'datascreen': 1,
'электроника': 1,
'генерация идей': 1,
'terrasoft crm': 1,
'creatio': 1,
'региональное развитие': 1,
'производство рекламных роликов': 1,
'фармацевтическая химия': 1,
'мобильные устройства': 1,
'digital signage': 1,
'uam': 1,
'отделочные материалы': 1,
'строительные материалы': 1,
'продуктовый менеджмент': 1,
'декор': 1,
'game designe': 1,
'technical project management': 1,
'корпусная мебель': 1,
'мягкая мебель': 1,
'освещение': 1,
'промышленные компьютеры': 1,
'wifi': 1,
'знание иностранных языков': 1,
'voip': 1,
'голосовые шлюзы': 1,
'customs clearance': 1,
'international logistics': 1,
'знание устройства автомобиля': 1,
'спортивные мероприятия': 1,
'аутсорсинг': 1,
'химические методы анализа': 1,
'u/x': 1,
'allfusion erwin data modeler': 1,
'ms publisher': 1,
'customer dev': 1,
'в2в': 1,
'буровой инструмент': 1,
'программы лояльности': 1,
'мобильное приложение': 1,
'разработка оборудования': 1,
'создание cjm': 1,
'scrum master': 1,
'rte': 1,
'работа с разработчиками': 1,
'генерация гипотез': 1,
'платежное направление': 1,
'user store map': 1,
'cusdev': 1,
'тестирование гипотез': 1,
'учет остатков': 1,
'1c: финансы': 1,
'управление продуктами': 1,
'анализ инвестиционных проектов': 1,
'проведение рекламных кампаний': 1,
'поисковые системы': 1,
'retention rate': 1,
'яндекс.метрика,': 1,
'in-page анализ': 1,
'когортный анализ': 1,
'высокоорганизованность': 1,
'scrum (agile)': 1,
'#it': 1,
'разработка склада': 1,
'гальваника': 1,
'химическое сырье': 1,
'водоочистка': 1,
'cdp': 1,
'customer data platform': 1,
'microsoft access': 1,
'ml': 1,
'machine learning': 1,
'контент': 1,
'digital project': 1,
'digital-продвижение; seo; smm; affiliate; ctr, cpa ,roi': 1,
'он-лайн проекты, цифровые технологии': 1,
'road map': 1,
'defi': 1,
'блокчейн': 1,
'ui/ux прототипирование': 1,
'b2с': 1,
'формирование продуктового видения': 1,
'создание новинок': 1,
'investments': 1,
'mobile application': 1,
'mobile application development': 1,
'виртуальный ассистент': 1,
'e commerce': 1,
'ux design': 1,
'prototyping': 1,
'запуск в производство': 1,
'расчёт эффективности проектов': 1,
'составление технических заданий': 1,
'оценка себестоимости продукта': 1,
'управление затратами': 1,
'формирование управленческой отчетности': 1,
'формирование бэклога': 1,
'организация пресс-конференций': 1,
'ga': 1,
'product strategies': 1,
'it products': 1,
'управление требованиями': 1,
'payments': 1,
'credit cards': 1,
'acquiring': 1,
'bank account': 1,
'bank licence': 1,
'money licence': 1,
'information security': 1,
'воронка продаж': 1,
'организация промо акций': 1,
'разработка и внедрение политик и процедур': 1,
'ms dos': 1,
'product perception': 1,
'routers': 1,
'consumer sales': 1,
'исполнительность': 1,
'командообразование': 1,
'product profit': 1,
'marketplace': 1,
'телефонные продажи': 1,
'инициативность': 1,
'ott': 1,
'adtech': 1,
'hrtech': 1,
'1с': 1,
'оценка эффективности проекта': 1,
'olap (online analytical processing)': 1,
'qlick': 1,
'приоритизация': 1,
'poe cameras': 1,
'wifi cameras': 1,
'ip cameras': 1,
'battery, 4g': 1,
'matomo': 1,
'oracle db': 1,
'product аналитика': 1,
'статистика': 1,
'smart meters, sensors, sockets, control center': 1,
'проведение глубинных интервью': 1,
'работа с ценностными предложениями': 1,
'прототипирование продуктовых интерфейсов': 1,
'исследование рынка конкурентов': 1,
'эффективная работа в удаленном формате': 1,
'предпринимательские качества': 1,
'гибкость': 1,
'оценка персонала': 1,
'жилая недвижимость': 1,
'keynote': 1,
'коммерческая недвижимость': 1,
'девелопмент': 1,
'офисная недвижимость': 1,
'знание продуктов «персональные компьютеры/мониторы»': 1,
'опыт развития/разработки продуктов': 1,
'опыт написания документации/создания презентаций': 1,
'авс анализ': 1,
'создание продуктовой линейки с "0"': 1,
'переговоры с иностранными производителями напрямую': 1,
'senior product owner': 1,
'senior product manager': 1,
'head of product': 1,
'lns': 1,
'itfs': 1,
'uifn': 1,
'lmn': 1,
'toll free service': 1,
'портирование vas номеров': 1,
'800-е номера': 1,
'did номера': 1,
'brand development': 1,
'prezi': 1,
'пуско-наладочные работы': 1,
'ввод в эксплуатацию': 1,
'adobe acrobat': 1,
'international contracts': 1,
'международные контакты': 1,
'опыт работы в закупках по направлению "товары для дома"': 1,
'иностранный язык: английский - свободный': 1,
'активный поиск перспективных товаров, новых поставщиков': 1,
'контроль сроков годности': 1,
'управление цепочкой поставок': 1,
'закупка продуктов питания': 1,
'sketchup': 1,
'виды страхования': 1,
'тёплые продажи': 1,
'опыт продаж': 1,
'оценка эффективности промо акций': 1,
'традиционная розница': 1,
'бытовая техника': 1,
'технология швейного производства': 1,
'материаловедение': 1,
'channels': 1,
'производство одежды': 1,
'работа с фабриками': 1,
'client management': 1,
'business communication': 1,
'навыки составления отчетности': 1,
'работа с системами аналитики': 1,
'pascal': 1,
'perfomance marketing': 1,
'косметика': 1,
'перевод': 1,
'digital recruitment': 1,
'сорсинг': 1,
'хантинг': 1,
'communication skills': 1,
'microsoft visual studio': 1,
'#маркетплэйс': 1,
'организация продуктового обучения': 1,
'quality management': 1,
'cloud technologies': 1,
'webinars': 1,
'design thinking': 1,
'strategic design': 1,
'product design': 1,
'customer research': 1,
'клиентские исследования': 1,
'new product development': 1,
'customer journey': 1,
'photoshop': 1,
'illustrator': 1,
'схд': 1,
'netapp': 1,
'развитие партнеров': 1,
'госты': 1,
'elk': 1,
'lucene': 1,
'solr': 1,
'канцтовары': 1,
'mvc': 1,
'react.js': 1,
'регрессионное тестирование': 1,
'лицензирование': 1,
'amocrm': 1,
'расчет себестоимости': 1,
'производственное планирование': 1,
'контроль исполнения решений': 1,
'выбор подрядных организаций': 1,
...}
Гораздо легче, чем с названиями вакансий. Чаще всего требуется знание английского, далее требуется опыт управления продуктом, владение powerpoint. Далее владение agile, sql, scrum.
# опыт
dataset_pm_all.groupby('experience.name')['id'].count().sort_values(ascending=False)
experience.name От 3 до 6 лет 926 От 1 года до 3 лет 802 Нет опыта 147 Более 6 лет 125 Name: id, dtype: int64
Чаще всего требуется опыт работы от 1 до 3 лет и от 3 до 6 лет.
dataset_pm_all.groupby('employer.name')['id'].count().sort_values(ascending=False)
employer.name
Ozon 41
LATOKEN 32
МТС 25
Сбербанк 23
ANCOR 22
..
Данфосс 1
Данные – центр обработки и автоматизации 1
Далитикс 1
Даичи 1
дормакаба Евразия 1
Name: id, Length: 1133, dtype: int64
Видно, что Ozon в топе.Следующие компании LATOKEN, МТС, Сбербанк. В основном в компаниях требуется мало продукт манагеров, это и логично, управленцев не должно быть много.
dataset_pm_all.groupby('employer.name')['salary.to'].mean().sort_values(ascending=False).head(10)
employer.name Behavox 640000.0 BookedBy 640000.0 Chatfuel 480000.0 Spotware Systems Ltd 442500.0 Binance 400000.0 АЙРО 400000.0 Selecty 385000.0 Нет 380000.0 Scalable Solutions 375000.0 BENEFIT 350000.0 Name: salary.to, dtype: float64
dataset_pm_all.groupby('employer.name')['salary.average'].mean().sort_values(ascending=False).head(10)
employer.name Behavox 560000.0 BookedBy 520000.0 Spotware Systems Ltd 378750.0 Chatfuel 360000.0 IT X100 335000.0 Binance 325000.0 Кадровое агентство Юнити 325000.0 АЙРО 325000.0 Нет 320000.0 Scalable Solutions 312500.0 Name: salary.average, dtype: float64
dataset_pm_all.groupby('employer.name')['salary.from'].mean().sort_values(ascending=False).head(10)
employer.name Behavox 482000.000000 Fivetran 440000.000000 BookedBy 400000.000000 Кадровое агентство Алексея Сухорукова 376000.000000 NetworkOptix 346666.666667 Spotware Systems Ltd 315000.000000 Wisebits 315000.000000 Antal Russia 300000.000000 DWI Consulting 300000.000000 Экспанс Малтипл 300000.000000 Name: salary.from, dtype: float64
Цифры говорят сами за себя :). Средняя зарплата у Behavox, BookedBy, Fivetran выше, чем у остальных. Примечательно, что в первом рейтинге они ведут себя примерно также. И все же вспоминаем, сколько пропусков было в зарплатах, это далеко не точный анализ.
Также в глаза бросается Кадровое агентство Алексея Сухорукова.
metro_num_pm = dataset_pm_all.groupby('address.metro.station_name')['id'].count().sort_values(ascending=False)
metro_num_pm
address.metro.station_name
Деловой центр 40
Бауманская 32
Водный стадион 29
Павелецкая 28
Выставочная 28
..
Долгопрудная 1
Славянский бульвар 1
Сокольники 1
Спортивная 1
Семеновская 1
Name: id, Length: 140, dtype: int64
# подгрузим табличку соответствия метро и района города
dataset_metro
| Station | District | |
|---|---|---|
| 0 | Третьяковская | район Замоскворечье |
| 1 | Медведково | район Северное Медведково |
| 2 | Первомайская | район Измайлово |
| 3 | Калужская | Обручевский район |
| 4 | Каховская | район Зюзино |
| ... | ... | ... |
| 302 | Стромынка | район Сокольники |
| 303 | Лефортово | район Лефортово |
| 304 | Зюзино | район Зюзино |
| 305 | Народное Ополчение | район Хорошёво-Мнёвники |
| 306 | Мнёвники | район Хорошёво-Мнёвники |
307 rows × 2 columns
dataset_stations_pm = dataset_pm_all[['id', 'address.metro.station_name', 'salary.from', 'salary.to']]
dataset_stations_pm = pd.merge(dataset_stations_pm, dataset_metro, left_on='address.metro.station_name', right_on = 'Station', how='inner')
dataset_stations_pm = dataset_stations_pm.drop_duplicates()
# dataset_stations.duplicated().sum()
dataset_stations_pm.groupby('District')['id'].count().sort_values(ascending=False)
District
Пресненский район 110
район Замоскворечье 62
Тверской район 56
Басманный район 50
район Аэропорт 44
...
район Марфино 1
район Кузьминки 1
район Якиманка 1
район Выхино-Жулебино 1
район Коньково 1
Name: id, Length: 69, dtype: int64
Видим, что большая часть вакансий находится в Пресненском, Замоскворечье и Тверском районах. В отдаленных районах Кузьминки, Коньково и так далее опять по 1 вакансии. В Пресненском районе почти в два раза больше, чем у следущего по количеству района.
fig = px.histogram(x=dataset_pm_all["salary.from"].dropna(), nbins = 25)
fig.update_layout(
title='Гистограмма нижней границы зарплаты',
xaxis={'title':'Зарплата'},
yaxis={'title':'Количество вакансий'})
fig.show()
fig = px.histogram(x=dataset_pm_all["salary.to"].dropna(), nbins = 25)
fig.update_layout(
title='Гистограмма верхней границы зарплаты',
xaxis={'title':'Зарплата'},
yaxis={'title':'Количество вакансий'})
fig.show()
# 25 самых популярных навыков
sorted_skills_pm = dict(sorted(Counter(list_of_skills_pm).items(), key=lambda item: -item[1]))
best_skills_pm = list(sorted_skills_pm.keys())[:25]
best_skills_pm
['английский язык', 'product management', 'управление продуктом', 'управление проектами', 'маркетинговый анализ', 'ms powerpoint', 'работа в команде', 'разработка нового продукта', 'agile project management', 'запуск новых продуктов', 'project management', 'бизнес-анализ', 'sql', 'scrum', 'проведение презентаций', 'управление командой', 'аналитическое мышление', 'atlassian jira', 'креативность', 'ux', 'ведение переговоров', 'развитие продаж', 'маркетинговые исследования', 'подготовка презентаций', 'аналитические исследования']
# самый популярные группы
sorted_groups_pm = dict(sorted(Counter(list_of_names_pm).items(), key=lambda item: -item[1]))
best_groups_pm = list(sorted_groups_pm.keys())[:10]
best_groups_pm
['product manager', 'менеджер продукта', 'продакт менеджер', 'product owner', 'категорийный менеджер', 'product marketing manager', 'project manager', 'бренд менеджер', 'ux', 'product designer']
# подсчет того, насколько часто требуется конкретный навык в конкретной группе
table_groups_skills_pm = np.zeros((len(best_groups_pm), len(best_skills_pm)))
def is_group_skill(row):
if row['skills']:
string = "".join(row['skills'])
# print(string)
for i, group in enumerate(best_groups_pm):
if row['name'].lower().find(group) != -1:
for j, skill in enumerate(best_skills_pm):
if string.lower().find(skill) != -1:
table_groups_skills_pm[i][j] += 1
for index in dataset_pm_all.index:
is_group_skill(dataset_pm_all.loc[index])
# построение heatmap по табличке
figure = go.Figure(
data=go.Heatmap(
x=best_skills_pm,
y=best_groups_pm,
z=table_groups_skills_pm,
zmin=0,
zmax=30,
colorscale='Viridis')
)
figure.update_layout(
title='Heatmap с количеством вакансий (от группы и навыка)',
xaxis={'title':'Навык'},
yaxis={'title':'Вакансия'})
figure.show()
Проблема в том, что очень много вакансий содержит слово product manager, однако все равно видны некоторые закономерности, в product marketing manager ценится маркетинговый анализ и маркетинговые исследования(удивительно!), у ux manager требуется знание ux, также как и у product designer. Все вполне закономерно. Очень много требований у product owner.
# избавимся от вакансий в Питере, Минске и за Уралом
dataset_pm_all = dataset_pm_all[(dataset_pm_all['address.metro.lng'] > 32) & (dataset_pm_all['address.metro.lng'] < 40)]
fig = px.scatter_mapbox(
dataset_pm_all,
lat='address.metro.lat',
lon='address.metro.lng',
hover_name = 'name',
zoom=10,
title='Координаты вакансий')
fig.update_layout(mapbox_style = "open-street-map")
fig.show()
# посмотрим на зарплату на карте
pio.renderers.default='notebook'
plotly.offline.init_notebook_mode(connected =True)
px.set_mapbox_access_token(open('token.txt').read())
fig = px.density_mapbox(dataset_pm_all,
lat = 'address.metro.lat',
lon = 'address.metro.lng',
z = 'salary.from',
zoom=10)
fig.show('notebook')
Здесь аналогичная ситуация, те, что ближе к центру горячее. Опять выделяется Москва-Сити.
dupl = [121, 186, 269, 281, 394, 481, 492, 612]
dataset_metro_num_pm = metro_num_pm.to_frame()
dataset_metro_num_pm = dataset_metro_num_pm.rename(columns={"id": "num"})
dataset_metro_num_pm = dataset_metro_num_pm.reset_index('address.metro.station_name')
dataset_metro_num_pm = pd.merge(dataset_metro_num_pm, dataset_pm_all, left_on='address.metro.station_name',
right_on = 'address.metro.station_name',
how='left')
dataset_metro_num_pm = dataset_metro_num_pm[['address.metro.lat', 'address.metro.lng', 'address.metro.station_name', 'num']]
dataset_metro_num_pm = dataset_metro_num_pm.drop_duplicates()
# dataset_metro_num_pm[dataset_metro_num_pm['address.metro.station_name'].duplicated()]
dataset_metro_num_pm = dataset_metro_num_pm.drop(dupl, axis=0)
dataset_metro_num_pm
| address.metro.lat | address.metro.lng | address.metro.station_name | num | |
|---|---|---|---|---|
| 0 | 55.749100 | 37.539500 | Деловой центр | 40 |
| 40 | 55.772405 | 37.679040 | Бауманская | 32 |
| 72 | 55.838978 | 37.487515 | Водный стадион | 29 |
| 101 | 55.729741 | 37.638693 | Павелецкая | 28 |
| 129 | 55.750243 | 37.542641 | Выставочная | 28 |
| ... | ... | ... | ... | ... |
| 882 | 55.938656 | 37.520542 | Долгопрудная | 1 |
| 883 | 55.729542 | 37.470973 | Славянский бульвар | 1 |
| 884 | 55.789282 | 37.679895 | Сокольники | 1 |
| 885 | 55.722388 | 37.562041 | Спортивная | 1 |
| 886 | 55.783096 | 37.719289 | Семеновская | 1 |
140 rows × 4 columns
# посмотрим количество на карте
pio.renderers.default='notebook'
plotly.offline.init_notebook_mode(connected =True)
px.set_mapbox_access_token(open('token.txt').read())
fig = px.density_mapbox(dataset_metro_num_pm,
lat = 'address.metro.lat',
lon = 'address.metro.lng',
z = 'num',
zoom=10)
fig.show('notebook')
Сильно выделяется район Москва-Сити, видимо, там сидит много продукт менеджеров.
# подсчет средней заработной платы от навыков
skills_money_pm = [0] * len(best_skills_pm)
num_money_pm = [0] * len(best_skills_pm)
def is_skill_money(row):
if row['skills']:
string = "".join(row['skills'])
for j, skill in enumerate(best_skills_pm):
if string.lower().find(skill) != -1:
if not pd.isna(row['salary.average']):
skills_money_pm[j] += row['salary.average']
num_money_pm[j] += 1
for index in dataset_pm_all.index:
is_skill_money(dataset_pm_all.loc[index])
for i in range(len(best_skills_pm)):
if num_money_pm[i] != 0:
skills_money_pm[i] /= num_money_pm[i]
# посмотрим на график заработной платы от навыков
fig = px.bar(x=best_skills_pm, y=skills_money_pm)
fig.update_layout(
title='Зависимость средней зарплаты от навыка',
xaxis={'title':'Навык'},
yaxis={'title':'Средняя зарплата с таким навыком'})
fig.show()
Вау! График очень даже информативный. Вижно, что ux ценится очень высоко. Также знание бизнес анализа, опят запусков продуктов и развитие продаж выделяются.
Замечание в тему. Многие из вас наверняка сейчас уже начинают задумываться о работе. Конечно, вы имеете на это полное право. Однако, по нашему опыту работа на 3 курсе отрицательно сказывается на степени усвоения материала. По сути все предметы цикла Data Science у вас еще впереди. Подумайте, наверное, лучше разобраться во всем во время учебы, чем потом что-то где-то нагонять. Более простой вариант — летняя стажировка, но не забудьте отдохнуть, набравшись сил перед непростым 3 курсом ☺.
В каждом пункте пользуемся методом моментов:
1) Из курса теории вероятностей:
В случае равномерного распределения \begin{cases} \mathsf E_{\theta} X_1 = \frac{a+b}{2} = \overline{X} \\ \mathsf E_{\theta} X_1^2 = \frac{a^2+b^2+ab}{3} = \overline{X^2} \end{cases}
То есть
\begin{cases} a = 2\overline{X} - b \\ 4\overline{X}^2 - 4\overline{X} b + b^2 +b^2+2 \overline{X} b - b^2 = 3 \overline{X^2} \end{cases}\begin{cases} a = 2\overline{X} - b \\ 4\overline{X}^2 - 2\overline{X} b + b^2 - 3 \overline{X^2} = 0 \end{cases}Так как $S^2 = \overline{X^2} - \overline{X}^2$, и вспоминая, что $b > a$, решая квадаратное уравнение, получаем
\begin{cases} b = \overline{X} \pm \sqrt{\overline{X}^2-4\overline{X}^2 + 3\overline{X^2}} \\ a = \overline{X} \mp \sqrt{\overline{X}^2-4\overline{X}^2 + 3\overline{X^2}} \end{cases}\begin{cases} b = \overline{X} + \sqrt{3S^2} \\ a = \overline{X} - \sqrt{3S^2} \end{cases}2) В случае пуассоновского распределения
$\mathsf E_{\theta} X_1 = \theta = \overline{X}$, это и будет ответом $\theta = \overline{X}$.
3) В случае нормального распределения. Так как $\sf D X = \sigma^2 = \mathsf E X^2 - (\mathsf E X)^2 = \mathsf E X^2 - a^2$ \begin{cases} \mathsf E_{\theta} X_1 = a = \overline{X} \\ \mathsf E_{\theta} X_1^2 = a^2 + \sigma^2 = \overline{X^2} \end{cases}
В итоге \begin{cases} a = \overline{X} \\ \sigma^2 = \overline{X^2} - \overline{X}^2 \end{cases}
В данной задаче вам предстоит распарсить сайт, который вы выберите.
1. Каждая ссылка (URL) в интернете состоит из нескольких компонент:
http или https,en.wikipedia.orgОдна и та же ссылка может иметь несколько форм и вести на ту же самую страницу. Во время обхода сайта это надо учитывать и сохранять один уникальный урл для каждой страницы. Процедура, приводящая урл к каноничному виду, называется нормализацией. Процедуры, которые применяются к урлу для нормализации, описаны, например, на Википедии.
Установите пакет url_normalize, в котором есть готовая функция для нормализации.
Прочитайте, как именно функция url_normalize меняет ссылку, и приведите примеры $4$ урлов, которые нормализуются к одному и тому же. Примеры должны демонстрировать различные этапы процедуры нормализации. Одним из этих примеров может быть сам нормализованный урл.
from url_normalize import url_normalize
print(url_normalize('http://www.example.com/%7Eusername/'))
http://www.example.com/~username/
print(url_normalize('http://www.example.com:80/~username/'))
http://www.example.com/~username/
print(url_normalize('http://www.example.com/../a/../c/.././~username/'))
http://www.example.com/~username/
print(url_normalize('http://www.example.com/~username/'))
http://www.example.com/~username/
Изучите код, в котором скачиваются страницы сайта simple.wikipedia.org с занятия про парсинг данных. Код, реализующий обход в ширину с фильтрацией и нормализацией урлов, приведён в виде функции.
from urllib.parse import urlparse, urldefrag, urljoin
from urllib.request import urlopen
from bs4 import BeautifulSoup
from queue import Queue
import time
def download_from_the_internet(url):
'''Скачивает сраницу с интернета
Параметры:
url (str) - ссылка на страницу для скачивания
Возвращает:
str - html-страница в виде строки, None в случае неудачи
'''
try:
return urlopen(url).read().decode('utf-8')
except KeyboardInterrupt:
raise
except:
return None
def extract_links_from_html(url, html):
'''Парсит ссылки на странице
Принимает:
url (str) - исходный урл страницы
html (str) - содержание html-страницы
Возвращает:
list - список ссылок, находящихся на странице
'''
if html is None:
return []
parser = BeautifulSoup(html)
# Формируем ссылки на те страницы, на которые ссылается документ
return [urljoin(url, link.get('href')) for link in parser.findAll('a')]
def extract_text_info_from_html(html):
'''Парсит текстовую информацию на страницу
Принимает:
html (str) - содержание html-страницы
Возвращает:
dict - текстовая часть страницы по ключу text,
название по ключу title
'''
if html is None:
return {}
try:
soup = BeautifulSoup(html, features="html.parser")
for script in soup(["script", "style"]):
script.extract()
# Объединяем строки текста
text = soup.get_text()
lines = (line.strip() for line in text.splitlines())
chunks = (phrase.strip() for line in lines for phrase in line.split(" "))
text = '\n'.join(chunk for chunk in chunks if chunk)
# Находим название на странице
title = soup.find('title').string
return {'text': text, 'title': title}
except:
return {}
Код обхода в ширину:
def load_web_pages(seed, max_downloads, filtration_function):
'''Обходит web-страницы в ширину и загружает информацию о них.
Принимает:
seed (str) -- страница, с которой начинать обход.
max_downloads (int) -- максимальное число загруженных страниц.
filtration_function (str -> bool) -- функция, указывающая,
стоит ли загружать страницу. Пример: is_wiki_article.
Возвращает:
pages_json (list) - список словарей с информацией о страницах.
'''
# Создаём список со страницами
pages_json = []
# Создаём очередь для обхода в ширину
q = Queue()
q.put(url_normalize(seed))
already_visited = set()
n_downloads = 0
time_start = time.time()
while not q.empty():
# Нормализуем урл
main_url = url_normalize(q.get())
if main_url in already_visited:
continue
already_visited.add(main_url)
html = download_from_the_internet(main_url)
# Извлекаем ссылки из страницы
children_links = extract_links_from_html(main_url, html)
time.sleep(1)
# Извлекаем текст страницы
text_info = extract_text_info_from_html(html)
#если все таки полезная страница
if text_info != {}:
# Добавляем запись в таблицу
text_info['url'] = main_url
pages_json.append(text_info)
text_info['num_links'] = len(children_links)
n_downloads += 1
#для того, чтобы смотреть, как загружаются страницы
if n_downloads % 10 == 0:
print(n_downloads)
if n_downloads > max_downloads:
break
# Добавляем ещё не посещённые ссылки в очередь
for child in children_links:
if url_normalize(child) not in already_visited \
and filtration_function(child):
q.put(url_normalize(child))
return pages_json
2. Выберите сайт, который вам интересен, а также некоторую категорию страниц в нём. Поймите, с какой страницы сайта надо начать обход, чтобы обходить сайты данной категории.
Пример: ищем статьи про Data Science на Википедии, начинаем со статьи Data Dcience.
Укажите, что выбрали: Сайт bbc.com, будем искать новости на политические темы.
Придумайте критерий, который по тексту из HTML-страницы будет определять, находится ли страница в определённой вами категории.
Пример: статья на Википедии про Data Science, если в ней есть слово "data" или термины из статистики, теории вероятностей и анализа данных.
Опишите критерий: Будет считать, что статься на политическую тему, если в ней встречаются слова по типу "president", "government", "election", "minister", "chef".
Начав с выбранной страницы, скачайте не менее $500$ страниц сайта. В качестве функции фильтрации возьмите функцию, которая отделяет страницы с выбранного сайта от других.
def filtr_function(url):
'''Проверяет, является ли ссылка страницей на www.bbc.com/news/'''
if 'www.bbc.com/news/' not in url:
return False
prohibited = ['php', 'uk']
# Проверяем, есть ли запрещённые строки в ссылке
for token in prohibited:
if token in url:
return False
return True
pages_json = load_web_pages('https://www.bbc.com/news', 500, filtr_function)
10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 390 400 410 420 430 440 450 460 470 480 490 500
Cделайте таблицу со следующей информацией:
Для последнего пункта можете воспользоваться функцией поиска слов по заданным префиксам, рассмотренной на занятии.
POLITIC_PREFIXES = [
'politi',
'president'
'governmen',
'election',
'minister',
'chief'
]
def is_in_category(text):
'''Вычисляет по тексту, является ли он про политику'''
if text is None:
return False
words = text.split()
# Приводим слова к нижнему регистру
words = [w.lower() for w in words]
for word in words:
for prefix in POLITIC_PREFIXES:
if word.find(prefix) != -1:
return True
return False
columns = ['url', 'num_words', 'is_political', 'num_links', 'title', 'small_title']
table = pd.DataFrame(columns=columns)
for i, page in enumerate(pages_json):
page['num_words'] = len(page['text'].split())
page['is_political'] = is_in_category(page['text'])
table = table.append({'url' : page['url'], 'num_links' : page['num_links'],
'num_words': page['num_words'], 'is_political': page['is_political'],
'title' : page['title'], 'small_title' : str(page['title'])[:50]}, ignore_index=True)
table.to_csv('first_news.csv')
table
| url | num_words | is_political | num_links | title | small_title | |
|---|---|---|---|---|---|---|
| 0 | https://www.bbc.com/news | 985 | True | 259 | Home - BBC News | Home - BBC News |
| 1 | https://www.bbc.com/news/coronavirus | 1720 | True | 330 | Coronavirus - BBC News | Coronavirus - BBC News |
| 2 | https://www.bbc.com/news/av/10462520 | 271 | False | 100 | One-minute World News - BBC News | One-minute World News - BBC News |
| 3 | https://www.bbc.com/news/world | 1806 | True | 358 | World - BBC News | World - BBC News |
| 4 | https://www.bbc.com/news/business | 2658 | True | 331 | Business - BBC News | Business - BBC News |
| ... | ... | ... | ... | ... | ... | ... |
| 496 | https://www.bbc.com/news/world-middle-east-568... | 952 | True | 119 | Middle East states top Amnesty list of executi... | Middle East states top Amnesty list of executi... |
| 497 | https://www.bbc.com/news/world-africa-56773817 | 426 | False | 126 | Handcuffed, blindfolded and beaten on Libya's ... | Handcuffed, blindfolded and beaten on Libya's ... |
| 498 | https://www.bbc.com/news/world-middle-east-567... | 1595 | True | 113 | Iran and Israel's shadow war takes a dangerous... | Iran and Israel's shadow war takes a dangerous... |
| 499 | https://www.bbc.com/news/world-middle-east-567... | 1140 | False | 122 | Iran nuclear attack: Mystery surrounds nuclear... | Iran nuclear attack: Mystery surrounds nuclear... |
| 500 | https://www.bbc.com/news/world-middle-east-566... | 1093 | True | 116 | Jordan crisis: How Prince Hamzah and Saudi Ara... | Jordan crisis: How Prince Hamzah and Saudi Ara... |
501 rows × 6 columns
Определите, какой процент скачанных страниц принадлежит выбранной категории?
table.sum()['is_political'] / len(table)
0.5728542914171657
C помощью гистограмм сравните визуально распределения количества слов в статьях из выбранной категории и во всех остальных. Для этих двух распределений вычислите средние, медианы и дисперсии. Средние и медианы отобразите на графиках с гистограммами. Сделайте выводы.
subgroups = [(table[table['is_political'] == True]), (table[table['is_political'] == False])]
subgroups
[ url num_words is_political \
0 https://www.bbc.com/news 985 True
1 https://www.bbc.com/news/coronavirus 1720 True
3 https://www.bbc.com/news/world 1806 True
4 https://www.bbc.com/news/business 2658 True
5 https://www.bbc.com/news/technology 1865 True
.. ... ... ...
493 https://www.bbc.com/news/world-europe-56845041 839 True
495 https://www.bbc.com/news/world-middle-east-567... 962 True
496 https://www.bbc.com/news/world-middle-east-568... 952 True
498 https://www.bbc.com/news/world-middle-east-567... 1595 True
500 https://www.bbc.com/news/world-middle-east-566... 1093 True
num_links title \
0 259 Home - BBC News
1 330 Coronavirus - BBC News
3 358 World - BBC News
4 331 Business - BBC News
5 328 Technology - BBC News
.. ... ...
493 122 Sarah Halimi: Frenchwoman's sister seeks trial...
495 115 Syria to hold election in May after years of w...
496 119 Middle East states top Amnesty list of executi...
498 113 Iran and Israel's shadow war takes a dangerous...
500 116 Jordan crisis: How Prince Hamzah and Saudi Ara...
small_title
0 Home - BBC News
1 Coronavirus - BBC News
3 World - BBC News
4 Business - BBC News
5 Technology - BBC News
.. ...
493 Sarah Halimi: Frenchwoman's sister seeks trial...
495 Syria to hold election in May after years of w...
496 Middle East states top Amnesty list of executi...
498 Iran and Israel's shadow war takes a dangerous...
500 Jordan crisis: How Prince Hamzah and Saudi Ara...
[287 rows x 6 columns],
url num_words is_political \
2 https://www.bbc.com/news/av/10462520 271 False
42 https://www.bbc.com/news/world-asia-india-5686... 488 False
43 https://www.bbc.com/news/world-asia-india-5685... 402 False
45 https://www.bbc.com/news/world-asia-56877634 581 False
46 https://www.bbc.com/news/world-us-canada-56859336 386 False
.. ... ... ...
489 https://www.bbc.com/news/world-middle-east-568... 702 False
492 https://www.bbc.com/news/world-middle-east-568... 936 False
494 https://www.bbc.com/news/world-middle-east-568... 733 False
497 https://www.bbc.com/news/world-africa-56773817 426 False
499 https://www.bbc.com/news/world-middle-east-567... 1140 False
num_links title \
2 100 One-minute World News - BBC News
42 128 India Covid crisis: Inside the Delhi hospital ...
43 82 Deaths climb as India reels from deadly Covid ...
45 107 Menstrual leave: South Korea airline ex-CEO fi...
46 120 Oscars 2021: The railway station now a hosting...
.. ... ...
489 111 East Jerusalem clashes leave over 100 injured ...
492 115 Syrian air-defence missile lands near Israeli ...
494 117 AI unlocks ancient Dead Sea Scrolls mystery - ...
497 126 Handcuffed, blindfolded and beaten on Libya's ...
499 122 Iran nuclear attack: Mystery surrounds nuclear...
small_title
2 One-minute World News - BBC News
42 India Covid crisis: Inside the Delhi hospital ...
43 Deaths climb as India reels from deadly Covid ...
45 Menstrual leave: South Korea airline ex-CEO fi...
46 Oscars 2021: The railway station now a hosting...
.. ...
489 East Jerusalem clashes leave over 100 injured ...
492 Syrian air-defence missile lands near Israeli ...
494 AI unlocks ancient Dead Sea Scrolls mystery - ...
497 Handcuffed, blindfolded and beaten on Libya's ...
499 Iran nuclear attack: Mystery surrounds nuclear...
[214 rows x 6 columns]]
plt.figure(figsize=(15, 10))
plt.title('Доля новостей на тему политики')
plt.hist(
subgroups[0]['num_words'],
bins=10,
density=True,
alpha=0.5,
color='orange',
label = 'Политиечские новости'
)
plt.hist(
subgroups[1]['num_words'],
bins=10,
density=True,
alpha=0.5,
color='blue',
label = 'Другие новости'
)
max_ylim = 0.0014
# средние и медианы
for j in range(2):
col = (j == 0) * 'orange' + (j == 1) * 'blue'
plt.axvline(subgroups[j]['num_words'].mean(), color=col, linestyle='dashed', linewidth=1)
plt.text(subgroups[j]['num_words'].mean()*1.1, max_ylim*0.9, 'Mean: {:.2f}'.format(subgroups[j]['num_words'].mean()))
plt.axvline(subgroups[j]['num_words'].median(), color=col, linestyle='dotted', linewidth=1)
plt.text(subgroups[j]['num_words'].median()*1.1, max_ylim*0.95, 'Median: {:.2f}'.format(subgroups[j]['num_words'].median()))
plt.xlabel("Количество слов")
plt.ylabel("Доля статей")
plt.legend()
plt.grid(ls=':')
plt.show()
Видно, что в политиечских новостях в среднем больше слов, чем в других. Также по гистограмма видно, что у политических новостей не такого, что у большого процента новостей определенное число слов, у них более менее равномерное распределение, в отличие от других новостей.
# дисперсия
print('Std political of news : {}, non political : {}'.format(subgroups[0]['num_words'].std(), subgroups[1]['num_words'].std()))
Std political news : 825.49783002828, non political : 573.9745906212022
Постройте boxplot-графики для того, чтобы сравнить эти 2 распределения. Какой способ сравнения кажется вам более удобным?
plt.figure(figsize=(10,10))
sns.boxplot(data=table, x='is_political', y='num_words', showfliers = False, palette='Set3')
plt.title('Количество слов в политических статьях')
plt.xlabel('Политическая новость')
plt.ylabel('Количество слов')
plt.show()
К слову, можно было не строить предыдущий график, на этом все видно гораздо лучше. Медиана количества слов в политических новостях повыше. Разброс примерно одинаковый.
3. При помощи plotly визуализируйте скачанные страницы сайта. В качестве значений по осям возьмите количество слов на странице и количество ссылок на ней. Цветом обозначьте принадлежность выбранной вами категории. При наведении курсора на точку, обозначающую страницу, должна появляться подсказка с названием этой страницы.
fig = px.scatter(table, x = 'num_words', y = 'num_links', color='is_political', hover_name = 'small_title')
fig.update_layout(
title='Количество ссылок от количества слов',
xaxis={'title':'Количество слов'},
yaxis={'title':'Количество ссылок'})
fig.show()
Ух ты, очень интересный график. Видно, что политические новости подразделяются на две группы, одна из которых ведет себя, как и остальные новости, количество ссылок в них колеблется у 100, а в другой она линейно растет от количества слов. Возможно, мы наткнулись на группу новостей, которые являются своеобразными итогами недели, где основной смысл -- собрать сссылки на новости за неделю, чтобы люди нашли для себя что-то важное.
4. Предложите функцию фильтрации web-страниц, которую нужно подать в load_web_pages, чтобы среди скачанных сайтов был больше процент страниц из выбранной вами категории.
def better_filtr_function(url):
'''Проверяет, является ли ссылка страницей на www.bbc.com/news/'''
if 'www.bbc.com/news/' not in url:
return False
prohibited = ['php', 'uk']
# Проверяем, есть ли запрещённые строки в ссылке
for token in prohibited:
if token in url:
return False
# заодно проверяет, что новость находится в категории world
if url.lower().find('world') != -1:
return True
return False
def better_load_web_pages(seed, max_downloads, filtration_function):
'''Обходит web-страницы в ширину и загружает информацию о них.
Принимает:
seed (str) -- страница, с которой начинать обход.
max_downloads (int) -- максимальное число загруженных страниц.
filtration_function (str -> bool) -- функция, указывающая,
стоит ли загружать страницу. Пример: is_wiki_article.
Возвращает:
pages_json (list) - список словарей с информацией о страницах.
'''
# Создаём список со страницами
pages_json = []
# Создаём очередь для обхода в ширину
q = Queue()
#теперь кладем пары из url и глубины
q.put((url_normalize(seed), 0))
already_visited = set()
n_downloads = 0
time_start = time.time()
while not q.empty():
# Нормализуем урл
cur = q.get()
main_url = cur[0]
cur_level = cur[1]
if main_url in already_visited:
continue
already_visited.add(main_url)
time_start = time.time()
html = download_from_the_internet(main_url)
time_end = time.time()
# Извлекаем ссылки из страницы
children_links = extract_links_from_html(main_url, html)
time.sleep(1)
# Извлекаем текст страницы
text_info = extract_text_info_from_html(html)
#если все таки полезная страница
if text_info != {}:
# Добавляем запись в таблицу
text_info['url'] = main_url
text_info['level'] = cur_level
text_info['num_links'] = len(children_links)
text_info['time'] = time_end - time_start
pages_json.append(text_info)
n_downloads += 1
#для того, чтобы смотреть, как загружаются страницы
if n_downloads % 10 == 0:
print(n_downloads)
if n_downloads >= max_downloads:
break
# Добавляем ещё не посещённые ссылки в очередь
for child in children_links:
if url_normalize(child) not in already_visited \
and filtration_function(child):
q.put((url_normalize(child), cur_level+1))
return pages_json
Скачайте снова не менее $500$ страниц, но уже с новой функцией фильтрации. Добавьте следующую информацию к каждой странице:
Для замера времени можете воспользоваться функцией time из пакета time.
better_pages_json = better_load_web_pages('https://www.bbc.com/news', 500, better_filtr_function)
10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 350 360 370 380 390 400 410 420 430 440 450 460 470 480 490 500
columns = ['url', 'is_political', 'level', 'time', 'small_title']
better_table = pd.DataFrame(columns=columns)
for page in better_pages_json:
page['is_political'] = is_in_category(page['text'])
better_table = better_table.append({'url' : page['url'], 'is_political': page['is_political'], 'level' : page['level'],
'time' : page['time'], 'small_title' : str(page['title'])[:50]}, ignore_index=True)
print("Процент политических новостей: {}".format(better_table.sum()['is_political'] / len(better_table)))
Процент политических новостей: 0.51
better_table.to_csv('second_news.csv')
Постройте гистограмму и ядерную оценку плотности для времени скачивания страницы.
hist_data = [better_table['time']]
group_labels = ['время загрзуки страниц']
fig = ff.create_distplot(hist_data, group_labels, bin_size=0.1)
fig.update_layout(
title='Гистограмма времен загрузки страниц',
xaxis={'title':'Время'},
yaxis={'title':'Доля страниц'})
fig.show()
plt.figure(figsize=(15, 10))
sns.distplot(better_table['time'], bins = 35, norm_hist=True)
plt.title('Гистограмма для времен загрузки')
plt.xlabel('Время загрузки')
plt.ylabel('Доля страниц')
plt.show()
Я построил графики двумя способами только для сравнения. Распределение очень напоминает нормальное или быть может Коши.
Какими известными вам стандартными распределениями оно может быть приближено? Найдите оценку параметров этого распределения по методу моментов и отобразите на графике плотность с полученными значениями параметров.
Замечание. Результат сильно зависит от сайта, железа и прочих характеристик. По идее должно получится неплохое приближение чем-то из того, что вам известно. Но если ничего не получится, то просто оставьте и прокомментируйте ваши попытки разобраться.
Кажется, что это похоже на нормальное распределение с учетом того, что время загрузки не может быть меньше 0. Да что уж там, почти все в природе имеет нормальное распределение.
По выведенному в пункте 4 для $\mathcal{N}(a, \sigma^2)$ \begin{cases} a = \overline{X} \\ \sigma^2 = \overline{X^2} - \overline{X}^2 \end{cases}
# подсчет через метод моментов
a = better_table['time'].mean()
time_sq = better_table['time'] * better_table['time']
sigma = (time_sq.mean() - better_table['time'].mean() ** 2) ** (0.5)
plt.figure(figsize=(20, 10))
x = np.linspace(a-3 * sigma, a + 3 * sigma, 100)
plt.plot(x, sps.norm.pdf(x, a, sigma))
plt.hist(better_table['time'], bins = 35, density=True)
plt.title('Гистограмма для времен загрузок')
plt.xlabel('Доля')
plt.ylabel('Время загрузки')
plt.show()
Выглядит не очень убеждающе.
Выводы: Оказалось, что метод, выбранный для поиска политических новостей оказался непостоянным, при последней загрузке новостей он выдал меньший процент политических новостей, чем предыдущий, скорее всего это связано с ухудшением эпидемиалогической обстановки, из-за которой появилось все больше новостей о ковидн. Значит, можно было в первом пункте искать новости в разделе world, а во втором искать просто. Рассматривался вариант с проверкой заголовка на ключеввые слова, однако он сильно ухудшал производительность.
Была собрана информация о времени загрузки страниц. К сожалению, метод моментов дал не слишком хорошие результаты, однако вид гистограммы мне точно напоминает нормальное распределение.
Также была рассмотрена интересная зависимость количества ссылок на странице от количества слов, которую я проанализировал выше.